Oben ist eine Anzahl von Einfallstoren gelistet, welche geschlossen werden müssen. Man sollte keine Includes mit Variablen durchführen, die über die HTTP-Eingabe erhalten worden sind, sondern immer Includes statisch machen und nur Dateien die auf dem gleichen Server liegen, inkludieren. Bei Emailversand sollte man die eingegebenen Emailadresse und Variablen überprüfen, ob sie keine Leerzeichen oder Steuerzeichen beinhalten. SQL-Injektion-Attacken kann man abblocken, indem man alle Variablen zu Beginn einfach filtert. Eine wirkungsvolle Methode, um eine Vielzahl von Attacken abzuwehren, ist es, nur bestimmte Zeichen in der Variable zuzulassen. Folgende kleine Funktion erlaubt es, nur kleine Buchstaben in den Variablen zu übergeben. Es kann einfach angepasst werden, wenn weitere Zeichen zugelassen werden sollen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php function onlyAllowSaveCharacters ($input) { $erlaubteZeichen = explode(":", "a:b:c:d:e:f:g:h:i:j:k:l:m:". "n:o:p:q:r:s:t:u:v:w:x:y:z"); $index = 0; $output = ''; while (in_array($input[$index],$erlaubteZeichen)==true) { $output .= $input[$index]; $index++; if ($index>strlen($input)) break; } return $output; } ?> |
Wenn man mit diesen Einschränkungen nicht leben kann und beispielsweise auch Sonderzeichen in die SQL-Abfrage übernehmen möchte, muss man entsprechende Zeichen casten, damit sie richtig übernommen werden. PHP stellt einige Funktionen dazu zur Verfügung, die einen unsicheren String in einen sicheren String umformen. Leider muss dieser sichere String bei der Ausgabe auch wieder in einen unsicheren zurück verwandelt werden.
Für beliebige Datenbankserver kann hier die Funktion addslashes()
zum Verbergen von entsprechenden Zeichen und stripslashes()
zur Entfernung der Verbergung angewandt werden. Für spezielle Datenbankmanagementsysteme stehen restriktivere Funktionen zur Verfügung.
Für eine MySQL-Datenbank sollte mysqli_real_escape_string()
verwandt werden. Diese Funktion ist abhängig von der Zeichensatztabelle der Datenbank, die gesetzt sein muss. Als erster Parameter nimmt sie die Datenbankverbindung entgegen, als zweiten Parameter den String der in einen sicheren String umgewandelt werden soll. Neben dem prozedualen Aufruf dieser Funktion existiert auch ein objektorientierter mit $dbobjekt->escape_string()
oder $dbobjekt->real_escape_string()
. Die Umwandlung des sicheren Strings in den ursprünglichen String geschieht wieder mit der Funktion stripslashes()
.
Strings, in welchem keine HTML-Teile einhalten sein dürfen, werden wie folgt modifiziert: Die Funktion htmlspecialchars()
setzt statt der HTML-Zeichen HTML-Codes. Als Ergebnis wird, wenn der HTML-Text an einen Browser zurückgeschickt wird, der Quellcode des HTML angezeigt. Dies gilt auch für eventuell eingebettete JavaScript-Programme. Mit htmlspecialchars_decode()
könnte dies wieder rückgängig gemacht werden. Dies ist jedoch meistens unerwünscht.
Die Funktion htmlentities()
arbeitet ähnlich. Allerdings wandelt diese Funktion wirklich alle Zeichen, die eine HTML-Entsprechung haben, in diese um. Dies gilt sowohl für die gefährlichen Zeichen wie auch für die ungefährlichen.
Mit Hilfe der Funktion strip_tags()
lassen sich alle HTML- oder PHP-Tags aus einer Eingabe entfernen. Als zweiter optionaler Parameter kann angegeben werden, welche Tags doch erlaubt sein sollen. Diese Funktion entfernt auch Kommentare aus HTML.
Cross-Site Skripting kann unterbunden werden, indem man auf diese Weise HTML- und Javascript-Eingaben herausfiltert, dass der Benutzer hinterher nicht einen interpretierten Code im Browser sieht, sondern den Quelltext des Codes zu Gesicht bekommt. Am Besten man schließt HTML-Tags sogar ganz aus. Dies ist zu bewerkstelligen, indem man die Größer- und Kleinerzeichen des HTMLs nicht erlaubt.