$_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:
- <?php
- array_walk ($_GET, ‚trimhtml‘);
- array_walk ($_POST, ‚trimhtml‘);
- ?>
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:
- <?php
- function trimhtml (&$value, $key) {
- $value = trim(htmlspecialchars($value, ENT_QUOTES));
- }
- ?>
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: <script>alert('haligali')</script>
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:
- <input type=“hidden“ name=“set[url]“ value=“http://host.de“>
- <input type=“text“ name=“text[name]“ value=““>
- <input type=“text“ name=“text[email]“ value=““>
- …
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:
- <?php
- array_walk_recursive ($_GET, ‚trimhtml‘);
- array_walk_recursive ($_POST, ‚trimhtml‘);
- function trimhtml (&$value, $key) {
- $value = trim(htmlspecialchars($value, ENT_QUOTES));
- }
- ?>