Steffen Peters: Kann ich alle $_GET und $_POST Daten auf einmal absichern?

Hi,

in einem Formular werden zahlreiche Felder (ca. 100) ans ein PHP-Script übertragen, verarbeitet und später in einer MySQL-Tabelle gespeichert.

Ich würde die Eingaben gerne absichern, um Missbrauch (bspw. SQL-Injektion) zu verhindern erschweren.

Damit ich nicht jedes einzelne Feld absichern muss, kann ich das automatisch mit allen Feldern machen?

Mein aktueller Ansatz ist:

if (!empty($_GET)) {
	$_GET = filter_var_array($_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
	extract($_GET, EXTR_OVERWRITE);
}
if (!empty($_POST)) {
	$_POST = filter_var_array($_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
	extract($_POST, EXTR_OVERWRITE);
}

Kann ich das so machen oder ist das nicht empfehlenswert?

LG Steffen

  1. Mein aktueller Ansatz ist:

    if (!empty($_GET)) {
    	$_GET = filter_var_array($_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    	extract($_GET, EXTR_OVERWRITE);
    }
    if (!empty($_POST)) {
    	$_POST = filter_var_array($_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    	extract($_POST, EXTR_OVERWRITE);
    }
    

    Kann ich das so machen oder ist das nicht empfehlenswert?

    BEWARE! (Lese die Antworten!)

  2. Hallo Steffen,

    aus meiner Sicht: Keinesfalls so machen.

    Was definitiv NICHT zu empfehlen ist, ist ein extract(). Wenn dir jemand "böse" Feldnamen postet, überschreibt er Dir damit deine eigenen Variablen. Lass die Werte in $_GET und $_POST stehen und verarbeite sie von dort aus.

    Es ist auch Unsinn, Benutzereingaben zu maskieren, wenn kein Kontextwechsel stattfindet. Wenn Dir jemand "Spaß & Freude" postet, willst Du das & auch in deinem PHP String sehen. Wenn dir jemand Steffen"; DROP TABLE students; postet, willst Du das im PHP ebenfalls genau so sehen - aber deine Datenbank soll das bitte nicht ungefiltert abbekommen. Bekommst Du <script src="https://evil.ru/kill.js"></script>, kannst Du das getrost im PHP verarbeiten und musst für das Speichern in der DB nur die " maskieren. Erst wenn's zum Browser geht, wird es brenzlig.

    Also: der erste relevante Kontextwechsel findet beim Speichern in der DB statt, und da musst Du eh die Escape- (oder Quote-)Funktion des DB Treibers nehmen. Der zweite relevante Kontextwechsel ist die Ausgabe ins HTML. DORT nimmst Du htmlspecialchars(), und zwar NUR das.

    Rolf

    --
    sumpsi - posui - obstruxi