Seite wählen
Anzeige
robhost-banner

$_GET[] und $_POST[] durch array_walk entschärfen

Mit der Methode array_walk(); kann man zum Beispiel gefährlichen Code aus den superglobalen Variablen POST und GET filtern.

array_walk

PHP verfügt durch array_walk eine recht interessante Funktion. In diesem Tutorial will ich zeigen, wie man array_walk nutzt um get- und post-Werte bereits zu beginn des PHP-Scripts „echo-kompatibel“ zu machen. array_walk funktioniert ähnlich wie das bekannte foreach mit dem Unterschied das array_walk für jeden Array-Wert eine Funktion zur weiteren Verarbeitung des Array-Eintrags aufruft.
Mit den Arrays $_GET und $_POST ergibt sich folgender Funktions-Aufruf:

  1.  <?php
  2.  array_walk ($_GET, ‚trimhtml‘);
  3.  array_walk ($_POST, ‚trimhtml‘);
  4.  ?>

array_walk geht die Werte von $_GET / $_POST durch und ruft für jeden Wert die Funktion trimHTML() auf. An dieser wird als erster Parameter der Value, als zweiter (optional) der Wert-Key übergeben.

Unsere trimHTML:

  1.  <?php
  2.  function trimhtml (&$value, $key) {
  3.  $value = trim(htmlspecialchars($value, ENT_QUOTES));
  4.  } 
  5.  ?>

Hier werden zwei Methon angewendet: htmlspecialchars() wandelt alle Sonderzeichen (<,>,“,‘,&) in HTMLs um. trim() „kehrt“ Leerzeichen und Breaklines von beiden Enden des Strings.

Ergebnis:

Query-Value vor dem Trimmen: <script>alert(‚haligali‘)</script>
Nach dem Trimmen: &lt;script&gt;alert(&#039;haligali&#039;)&lt;/script&gt;

Statt htmlspecialchars() lässt sich htmlentities() einsetzen. Es wandelt alle Sonderzeichen (also Umlaute) in HTMLs. strip_tags() dagegen entfernt HTML-Tags, bzw. alles zwischen < und > aus dem String.

Mehrdimensionale Arrays

Für das Trimmen verschachtelter Arrays benutzen wir array_walk_recursive. Mehrdimensionale Arrays machen Sinn, wenn viele Werte verarbeitet werden. Zum Beispiel bei diesem Aufruf: showEntries($_POST[‚text‘]). showEntries() erhält ein Array, das nur Sub-Values des text-indexes enthält.
Mehrdimensionale Variablen werden in einem HTML-Formular deklariert durch:

  1.  <input type=“hidden“ name=“set[url]“ value=“http://host.de“>
  2.  <input type=“text“ name=“text[name]“ value=““>
  3.  <input type=“text“ name=“text[email]“ value=““>
  4.  …

An den Wert von url kommen wir durch $_POST[’set‘][‚url‘] ran.
Bei der Get-Übergabe von Arrays haben wir folgende Query: ?a=val&b[c1]=wert1&b[c2]=wert2

trimHTML() als Debugger

Wir können die kleine trimHTML Funktion zu einem einfachen Debugger umfunktionieren: Ein echo zeigt alle übergebenen Parameter, die array_walk durchläuft, an.

Der ganze Code:

  1.  <?php
  2.  array_walk_recursive ($_GET, ‚trimhtml‘);
  3.  array_walk_recursive ($_POST, ‚trimhtml‘);
  4.  function trimhtml (&$value, $key) {
  5.  $value = trim(htmlspecialchars($value, ENT_QUOTES));
  6.  }           
  7.  ?>