Wie PHP $_POST säubern?
In einem Formular frage ich verschiedene Werte ab, die dann letztendlich in einer MySQL Datenbank abgefragt werden. Daher möchte ich das $_POST Array komplett in PHP säubern. Also z.B. in Form von $_POST = array_map('magic',$_POST);
Bei mir enthält $_POST ein multidimensionales Array, z.B.
Array
(
[bla] => 123
[blubb] => abc
[language] => de
[multiple] => Array
(
[0] => <>&\‘\>alert();\<\
)
[year_min] => 1983
[year_max] => 2022
Wie kann ich $_POST möglichst schnell und sicher säubern? Geht das mit array_map und einer passenden Funktion "magic'? Wenn ja, wie? Wenn nein, wie dann? Habe jetzt gerade eine Stunde gesucht und ausprobiert, aber nichts Funktionierendes für diese eigentlich häufige Anforderung gefunden.
2 Antworten
Wie kann ich $_POST möglichst schnell und sicher säubern
am besten mit prepared statements. Ansonsten mit
foreach($_POST ...)
Alex
Wie säubere ich diese
ebenso einfach in der foreach Schleife abfragen ob es ein Array ist und wenn ja ebenfalls darüber iterieren.
Einfach prepared Statements mit parametern benutzen. Das wird dann automatisch alles gegen sql injections escaped, falls dass dein Plan ist.
Danke schonmal. Wenn ich Deinen kurzen Hinweis verstehen würde, hätte ich hier vermutlich nicht gefragt. Hast Du einen Code-Schnipsel für mich? Das, was ich gefunden habe, hat nicht funktioniert.
Danke. Diese Variante scheint gut zu funktionieren, wenn man eine statische Anzahl an Bedingungen an die Datenbank schickt.
In meinem Fall können die Bedingungen stark abweichen. Wird im Formular etwas ausgewählt, taucht es auch im $_POST auf. Dies kann für Checkboxen [charge] => 1 sein. Für Multiselects können dies aber im Extremfall auch viele Werte in einem Unterarray sein:
Array
(
[charge] => 1
[multiple] => Array
(
[0] => <>&\‘\>alert();\<\
[1] => was_anderes
[2] => noch_was
)
)
Daher weiß ich nicht, wie ich dies präparieren soll, denn einen Platzhalter kann ich ja nicht setzen, da ich nicht vorher weiß, welche Werte über $_POST kommen und welche ich dann in der db abfragen soll.
Ich dachte, es gibt eine sinnvolle Funktion, mit der ich einfach den gesamten $_POST Array säubern kann.
Ich habe gerade folgendes probiert und es scheint zu funktionieren.
function sanitize ($input) {
return filter_var($input,FILTER_SANITIZE_SPECIAL_CHARS);
}
function array_map_recursive($func, array $arr) {
foreach ( $arr as $key => $val ) {
$arr[ $key ] = is_array( $val ) ? array_map_recursive( $func, $val ) : $func( $val );
}
return $arr;
}
$_POST = array_map_recursive('sanitize',$_POST);
Spricht irgendwas dagegen, es so zu machen? Statt
[0] => <>&\‘\>alert();\<\
steht da jetzt drin
[0] => <>&\‘\>alert();\<\
was für die SQL Abfrage ungefährlich ist.
Soweit war ich schon, allerdings sind im $_POST Array ja auch andere Arrays, im Beispiel "multiple". Wie säubere ich diese und womit am besten? Hast Du vielleicht einen Code-Schnipsel, den ich ausprobieren kann?