• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Alle $_POST elemente Maskieren

bodo92

Aktives Mitglied
Hallo,

Ich habe bisher meine $_POST elemente mit folgenden code Maskiert um einen XSS Angriff zu verhindern:
PHP:
if (!empty($_POST)) {
            foreach ($_POST as $key => $value) {
                if (!is_array($_POST[$key])) {
                    $_POST[$key] = htmlspecialchars($value);
                } else {
                    foreach ($_POST[$key] as $subkey => $subvalue) {
                        $_POST[$key][$subkey] = htmlspecialchars($subvalue);
                    }
                }
            }

Möchte jetzt aber mit array_walk_recrusive () automatisch alle dimensionen durchlaufen.
Dazu habe ich folgenden Code:
PHP:
if (!empty($_POST)) {
                function maskArray($key, $value) {
                    $_POST[$key] = htmlspecialchars($value);
                }
                array_walk_recursive($_POST, 'maskArray');
            }

Mir war von vornherein klar das das so nicht funktioniert, da jeder loop immer ein neues element direkt in $_POST anlegt.
Gibt es eine bessere Möglichkeit das array vollständig zu maskieren als im meinem ersten Beispiel?
 
Werbung:
PHP:
function escapeSpecialCharsDeep($value)   {
    $value = is_array($value) ? array_map('escapeSpecialCharsDeep', $value) : htmlspecialchars($value);
     return $value;
}

sowas wäre möglich... Ob das klug ist, muss jemand sagen, der sich mit PHP Security usw... besser auskennt als ich ;)
 
Dankeschön, hoffe das Funktioniert kann leider gerade nicht Testen muss meine Zeit aus Arbeit noch absitzen.

Ich verstehe allerdings nicht warum du den array_map innerhalb der Funktion die er wiederum selbst aufruft machst.
Wäre lieb wenn du mir das kurz erläutern kannst, in der Dokumentation fand ich es nur nach den Schema ähnlich dem was ich mit array_walk_recrusive() gemacht hab.
 
Werbung:
Wenn es kein Array ist, wende ich auf einen Wert direkt htmlspecialchars an. Wenn es ein Array ist, rufe ich für jeden Wert im Array, nochmal die erste Funktion auf, also Check ob kein Array usw... bis alles "gehtmlspecialchar't" ist.

Aber ich stimme @scbawik zu, das ist vielleicht aus algorithmischer Sicht schöner Code, aber Securitymässig passt es für mich nicht ganz.
 
Ich hab was ganz tolles gefunden :)
PHP:
filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

Edit:
Ich nehme mir eure Ratschläge zu Herzen, jedoch wäre es mir hier fast unmöglich jeden wert manuell zu maskieren, es sei denn es würde ein offensichtliches Sicherheitsproblem darstellen!
Meine Daten sehen so aus und werden anschließend in die Datenbank gespeichert also verhindere ich hiermit Stored-XSS:
Code:
array (size=15)
  'datum' => string '08.04.2015' (length=10)
  'zeit' => string '08:04' (length=5)
  'dauer' => string '105' (length=3)
  'ort' => string 'ORT' (length=3)
  'titel' => string 'TITEL' (length=5)
  'bericht' => string 'BERICHT' (length=7)
  'stichwort' => string 'B 6' (length=3)
  'art' => string 'Brand' (length=5)
  'personal' => string '18' (length=2)
  'fahrzeuge' =>
    array (size=3)
      0 => string '1' (length=1)
      1 => string '3' (length=1)
      2 => string '5' (length=1)
  'feuerwehren' =>
    array (size=3)
      0 => string '17' (length=2)
      1 => string '16' (length=2)
      2 => string '11' (length=2)
  'kraefte' =>
    array (size=2)
      0 => string '11' (length=2)
      1 => string '<script>alert('Gefahr!!!')</script>' (length=57)
  'radius' => string '75' (length=2)
  'breitengrad' => string '44.444444' (length=9)
  'laengengrad' => string '11.111111' (length=9)


Was haltet ihr hiervon?
 
Zuletzt bearbeitet:
Werbung:
Ich finde es allgemein ein wenig hässlich die Daten so verstümmelt in Datenbank zu speichern.
Man sollte dies nur in den verschiedenen Kontextwandeln behandeln und nicht von Grundauf escapen.

Zuerst die Eingaben validieren und prüfen.
Beim Speichern in die Db mit Prepered Statments arbeiten. Und dann bei der Ausgabe mit htmlspecialchars bearbeiten :-)


Lesematerial dazu:

http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel (ff)
 
Zuletzt bearbeitet:
Ich habe mir jetzt vorgenommen meine Validator-Klasse neu zu schreiben und hier die Werte je nach Notwendigkeit zusätzlich zur Validierung mit dem Filter FILTER_SANITIZE_SPECIAL_CHARS zu Maskieren.
Demnach müsste ich ein valides Element wie z.B. Zeit, Datum, Email nicht Maskieren da es keinen Schadcode enthalten kann, Elemente jedoch die nur auf Existenz und Länge geprüft werden erhalten den Filter richtig?

Ich setzte in meiner App ausschließlich Prepared Statements ein, ich mach das auch nicht um SQL-Injection zu verhindern.

Das mit den Stored-XSS sehe ich anders, ich gehe zwar nicht davon aus das meine DB sauber ist aber ich will auch nicht bewusst ein unmaskierten String ablegen.
 
Zurück
Oben