Wie PHP $_POST säubern?

2 Antworten

Wie kann ich $_POST möglichst schnell und sicher säubern

am besten mit prepared statements. Ansonsten mit

foreach($_POST ...)

Alex

skyynet 
Fragesteller
 15.06.2022, 14:10

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?

0
EinAlexander  15.06.2022, 14:21
@skyynet
Wie säubere ich diese

ebenso einfach in der foreach Schleife abfragen ob es ein Array ist und wenn ja ebenfalls darüber iterieren.

0

Einfach prepared Statements mit parametern benutzen. Das wird dann automatisch alles gegen sql injections escaped, falls dass dein Plan ist.

skyynet 
Fragesteller
 15.06.2022, 14:08

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.

0
jort93  15.06.2022, 14:11
@skyynet

Sowas in die Richtung

$stmt = $pdo->prepare("SELECT * FROM mytable WHERE id = ?"); 
$stmt->execute([$_POST['id']]);
0
skyynet 
Fragesteller
 15.06.2022, 16:23
@jort93

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.

0
skyynet 
Fragesteller
 15.06.2022, 16:59
@skyynet

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] => &#60;&#62;&#38;\‘\&#62;alert();\&#60;\

was für die SQL Abfrage ungefährlich ist.

0