Angriffe durch das Manipulieren von Parametern

Angriffe durch das Manipulieren von Parametern

Häufig werden bei Angriffen Parameter manipuliert, die an das PHP-Script übergeben werden. Werden Parameter aus superglobalen Variablen wie $_GET,$_POST,$_REQUEST,$_COOKIE ohne Prüfung z.B. an ein SQL-Statement übergeben, wären SQL-Injections problemlos möglich. So könnten Angreifer Datensätze aus der Datenbank auslesen, ändern oder löschen.

Übergibt man ungeprüfte Variablen an die PHP-Anwendung, sind nicht nur SQL-Injections möglich, sondern Angreifer haben so auch die Möglichkeit einen schadhaften Code in die PHP-Anwendung zu schleusen und erheblichen Schaden anzurichten.

PHP, ist eine schwach typisierte Sprache. So kann eine Variable mit dem Wert 1 eine Zeichenkette, ein Integer Wert oder ein boolscher Wert sein. Parameter, die über ein Formular oder der URL übergeben werden, werden grundsätzlich als String übergeben. Darin können Zeichen enthalten sein, die unerwünscht sind. Deswegen solltet Ihr. bevor Ihr was mit der Variablen macht, diese in den gewünschten Datentyp umwandeln. Ausgenommen man möchte den String weiterverarbeiten, dann ist eine Typumwandlung weniger sinnvoll.

PHP bietet für die Typumwandlung einen Cast-Operator an. Damit habt Ihr die Möglichkeit, den Datentyp in Klammern, vor der umzuwandelnden Variable zu setzten um so eine Typisierung durchzuführen bzw. zu erzwingen.

Beispiel:

<?php
$user = (int) $_GET['user_id'];
?>
Würde die GET Variable vor der Umwandlung den Inhalt 123acf haben, so hätte die Variable nach der Typisierung den Inhalt 123. Sonderzeichen und Buchstaben werden bei der Umwandlung in einen Integer Wert gelöscht.

Für den Cast-Operator gibt es folgende Typenbezeichnungen:

Möchte man die Zeichenkette beibehalten, so sollte man alle Sonderzeichen maskieren und die HTML-Tags entfernen. Um HTML-Tags aus einer Zeichenkette zu entfernen, bietet PHP eine Funktion mit dem Namen strip_tags() an. Damit lassen sich problemlos HTML-Tags aus einer Zeichenkette entfernen, bzw. kann man so nur bestimmte HTML-Tags erlauben.

Beispiel:

<?php
$string = '<b>Ich bin ein Text</b>';
echo $string;
?>
Würde man diesen Code jetzt ausführen, würde:
Ich bin ein Text
angezeigt werden. Wenn man jetzt den Code mit der Funktion strip_tags() erweitert,:

Beispiel:

<?php
$string = '<b>Ich bin ein Text</b>';
echo strip_tags($string);
?>
werden alle HTML-Tags entfernt und der Text wird in normaler Form angezeigt. Wenn man nun aber bestimmte HTML-Tags erlauben möchte, kann man als zweiten Parameter ein Array mit erlaubten HTML-Tags an die Funktion übergeben.

Beispiel:

<?php
$string = '<b>Ich bin ein Text</b><script%gt;alert('und ich auch');</script>
echo $string;
?>
Das obige Beispiel erzeugt eine Ausgabe mit einem Dialogfenster. Wenn man nun wieder strip_tags() anwendet und den Fett gedruckten Text erhalten möchte, übergibt man zu dem String noch ein Array mit erlaubten HTML-Tags an die Funktion. Das wümrde dann ungefähr so aussehen:

Beispiel:

<?php
$string = '<b>Ich bin ein Text</b><script>alert('und ich auch');</script<
echo strip_tags($string,"<b>");
>?
Somit erlauben wir der Funktion strip_tags() den HTML-Tag <b> zuzulassen und alle weiteren HTML-Tags werden aus dem String entfernt.

Eine weitere Möglichkeit, ungültige Inhalte zu filtern, ist die Whitelist-Überprüfung.

Beispiel:

<form action="kontakt.php" method="POST">
<select name="anrede">
<option value="frau">Frau</option>
<option value="herr">Herr</option>
</select>
</form>
Wir haben jetzt hier eine Auswahlbox mit zwei vordefinierten Werten und nur genau diese beiden Werte sollen für die Weiterverarbeitung zugelassen werden. Das überprüfen wir mit dem folgenden Code:

Beispiel:

<?php

$clean = array();
$anrede = array('frau','herr');

     if( in_array($_POST['anrede'],$anrede) ){
          $clean['anrede'] = $_POST['anrede'];
     }else{
         echo 'fehler';
     }

?>
Zuerst wird ein Array erstellt, welches die gültigen Daten enthält. In der if-Anweisung, prüfen wir mit Hilfe der Funktion in_array(), ob der Wert aus der $_POST Variablen auch in dem Array $anrede vorhanden ist. Wenn dies der Fall ist, wird der Wert aus der $_POST Variable in einen vorinitialisierten Array geschrieben. Somit könnt Ihr den Daten aus $clean immer vertrauen.