Kann ich alle $_GET und $_POST Daten auf einmal absichern?
Steffen Peters
- php
- programmiertechnik
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
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?
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