das Vorfiltern - strip_tags() und seine Freunde
Freitag, 19 Juni 2009
Vertraue keinen Benutzereingaben - das muss oberste Priorität haben. Fangen wir also gleich an, die mit dem Formular einstrudelnden Daten zu validieren.
<?php
$get=strip_tags($get);
$get=str_replace("\n", "", $get);
$get=trim($get);
?>
Mit strip_tags() entfernen wir restlos alle Tags, <script> und dergleichen bleiben aussen vor. Mit str_replace() entfernen wir einen möglichen Zeilenumbruch, der gerne verwendet wird, um den Code zu unterbrechen und Schadcode einzuschleusen. trim() rundet die Sache ab, damit werden Leerzeichen vor und nach dem String gelöscht.
Das erste $get steht exemplarisch für ein $_POST oder $_GET. Wir bauen aus den Zeilen nun eine Funktion und können so die Variablen filtern.
<?php
// Variablen
$vorname = filterfunktion($_GET['vorname']);
$mitteilung = filterfunktion($_POST['mitteilung']);
// die Funktion
function filterfunktion($get){
$get=strip_tags($get);
$get=str_replace("\n", "", $get);
$get=trim($get);
return $get;
}
?>
Das ist schonmal ein guter Anfang. Was fehlt, ist das Spezielle. Enthält das Feld eine URL, eine Emailadresse, eine Telefonnumer? Wir sollten also diese Fälle genau prüfen. Im Eingabefeld soll nur genau das stehen, was wir erwarten. Um eine Telefonnummer zu prüfen, verwenden wir folgende Codezeile:
<?php
if($get=="" || !preg_match('#^[0-9 ()/-]+$#', $get)){$get='';}
?>
Im Ausdruck preg_match legen wir fest, das alles, was nicht eine Zahl von 0-9, eine Klammer, ein Schrägstrich oder ein Bindestrich ist, die Variable $get leer werden lässt. Andersrum, handelt es sich um eine Telefonnummer wie z.B. 06838/981073 oder 06838-981073 oder (49)6838/981073 gibt unsere Funktion diese zurück. Ist die Synthax nicht entsprechend, gibt die Funktion nichts zurück.
Same procedure bei der Synthax einer Emailadresse. Ein @ Zeichen muss vorhanden sein. Vor dem @ dürfen nur Buchstaben, Ziffern, Punkte, underlines, Bindestriche stehen. Das gleiche nach dem @ Zeichen (bis auf underlines) gefolgt von einem Punkt. Nach dem Punkt dürfen nur noch 2-4 Buchstaben folgen, keine Zahlen oder sonstigen Zeichen.
<?php
if($get=="" || !preg_match('#^([a-zA-Z0-9\.\_\-]+)@([a-zA-Z0-9\.\-]+\.[A-Za-z][A-Za-z]{2,4})$#', $get)){$get='';}
?>
Die Mail ist auch geprüft. Nun zu den Postleitzahlen. In Deutschland sind das immer 5 Zahlen. In der Schweiz und in Österreich, ASAIK, 4 Zahlen. Unsere Prüfung sucht also Zahlen zwischen 0 und 9, es düfen aber nur 4- bzw. 5 Stellen sein. Alles andere wird von unserer Funktion gekillt, also leer zurückgegeben.
<?php
if ($get=="" || !preg_match('#^[0-9]{4,5}$#', $get)){$get='';}
?>
Jetzt soll auch die Webseite dran glauben. Da nicht sichergestellt ist, ob die Eingabe mit oder ohne http:// erfolgt, entfernen wirs und setzen es wieder vorn dran (1.Zeile). Dann checken wir, ob die Synthax einer URL erfüllt ist. Fast so wie zuvor bei der Emailsynthax:
<?php
$get=str_replace("http://", "", $get); $get='http://'.$get;
if($get=="" || !ereg("^(http://)?([a-z0-9-]+\.)+([a-z0-9-]{2,4}).*$", $get)){$get='';}
?>
Was kommt noch rein? Vielleicht etwas, das nur aus Zahlen besteht.
<?php
if ($get=="" || (int)$get==""){$get='';}
?>
Das (int) ist ein sogenanntes Typecast, es führt die Variable in einen bestimmten Typus, hier integer. Ist die Variable $get mit Typus integer leer, handelt es sich nicht um eine Zahl. Statt (int) könnte man auch mittels Funktion intval() der Variablen den Typ Zahl verpassen.
Und nun? Sollen die Daten in einer Mysql-Datenbank gespeichert werden? Mit der Funktion mysql_real_escape_string() werden verschiedene Zeichen maskiert, die beim Benutzen von SQL-Statements störend bzw. schädlich sind.
This is a nested column
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
This is another nested column
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.