EGPCS-Variablen waschen und desinfizieren

tempa wrote this 09:38:

Allem, was von außen kommt, misstraut der Programmierer mit gutem Grund. Was von außen kommt, wird gereinigt, desinfiziert und vom Türsteher nur durchgelassen, wenn die Variable den Whitelist-Pass passiert. Was muss zum Türsteher? Die EGPCS-Variablen (Environment, GET, POST, Cookie, Server), die Superglobals:

  • $_ENV
  • $_GET
  • $_POST
  • $_REQUEST
  • $_COOKIE
  • $_SERVER
  • $_SESSION

Seit PHP5 gibt es zur Absicherung der Superglobals die Filterfunktionen, u.a. filter_input_array, mit dem man gleich eine Sammlung, wie man sie in einem Formular vorfindet, bereinigen kann. Dazu sollte man auch noch die Übersicht der Sanitize filters kennen. Die PHP Dokumentation hat es versäumt Querverweise auf den Seiten bereitzustellen oder es verständlich mit Anwendungsbeispielen zu dokumentieren (Ein PHP-Doku-Klassiker).

Eine gute, gebrauchstaugliche Hilfe für die Filterfunktion habe ich auf jqueryandphp.com gefunden: Before I get started… (aka – Always Sanitize Your User Input!)

So sieht das z.B. aus – das Formular mit den zu säubernden Formularfeld-Eingaben:

  1. <form action="adduser.php" method="post">
  2. Vorname: <input type="text" name="vorname" /><br/>
  3. E-mail: <input type="text" name="email" /><br/>
  4. Alter: <input type="text" name="alter" /><br/>
  5. <input type="submit" value="Add User" />
  6. </form>

und der Filterdurchlauf der Formularfeld-Eingaben mittels Array:

  1. $filter = array(
  2. 'vorname' => FILTER_SANITIZE_STRING,
  3. 'alter' => array(
  4. 'zahlenformat' => FILTER_VALIDATE_INT,
  5. 'altersvorgabe' => array('mindestalter' => 18)
  6. ),
  7. 'email' => FILTER_VALIDATE_EMAIL
  8. );
  9. $_FILTERAUSZUG = filter_input_array(INPUT_POST, $filter);

Das funktioniert auch mit den anderen Superglobals. Aber Achtung – wer das einsetzt, sollte sicher stellen, dass die PHP-Umgebung die entsprechenden Voraussetzungen erfüllt, denn wenn nicht, ist man mit dem guten alten preg_match, siehe PHP-Infektionen und anderen Unfug via $_GET und htmlspecialchars, besser bedient und das arbeitet in ähnlicher Weise wie die Filter.

Leave a Reply