dedlfix: Sicher Programmieren

Beitrag lesen

echo $begrüßung;

Ein in PHP 5.2 hinzugekommenes Feature, das sich um die sichere Übernahme der Eingabedaten kümmern soll, nennt sich Filter Functions. Und da gibt es einen Filter namens FILTER_SANITIZE_MAGIC_QUOTES, der alle Werte durch add_slashes() schickt.

Dann hättest du aber grad „sichere Übernahme“ in Anführungszeichen schreiben müssen. Mit diesem Filter gewinnt man nichts dazu, das alte Sicherheitsproblem wird nur umbenannt.

Die Betonung liegt auf "diesem", denn es gibt ja noch jede Menge anderer geeigneterer Filter. Zum Beispiel lässt sich EMail-Header-Injection verhindern, indem man den Filter FILTER_SANITIZE_STRING zusammen mit dem Flag FILTER_FLAG_STRIP_LOW (entfernt Steuerzeichen) verwendet.

$from = filter_input(INPUT_POST, 'from', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);

Leider ist das ein wenig aufwendig und man muss sowohl diese Möglichkeit kennen und anwenden wollen als auch wissen, dass man die Steuerzeichen rausfiltern muss, aber dann hat man damit einen harmlosen From-Wert.

Ich habe mir die Manual mal angeschaut, was ich dabei vermisse, wäre eine Möglichkeit, echo nen Filter mitzugeben bzw. für Ein- und Ausgabe getrennte Filter zu definieren. Aber dieses Feature ist noch jung, wir wollen nicht meckern.

Dieses Feature ist eigentlich auf Eingabedaten zugeschnitten und arbeitet mit den EGPCS-Werten ($_*, Superglobals). Leider vermischt es teilweise die Behandlung von Eingabedaten mit der Ausgabeaufbereitung, doch das wird vielen Anwendern egal sein, die das EVA-Prinzip nicht kennen. Aber neben filter_input() gibt es auch filter_var(), dem man eine beliebige, auch selbst erstellte oder aus anderen Quellen stammende Variable übergeben kann, was sich dann für das echo verwenden lässt.

echo filter_var($row['field'], FILTER_SANITIZE_SPECIAL_CHARS);

Nötig ist das so nicht, dafür gibt es ja bereits htmlspecialchars() (es sei denn, man hängt noch zusätzliche Filter-Flags an). Und guter Stil ist das auch nicht. Wenn es erst einmal so gekommen ist, dass schon ungewünschte Daten in der Datenspeicherung gelandet sind, sollte man seine Eingabedatenbehandlung überdenken oder seine Anwendung mehr nach EVA strukturieren.

echo "$verabschiedung $name";