Sicheres Programmieren mit PHP (3)
Cross Site Scripting (XSS)
Unter "Cross Site Scripting" versteht man das "Einschleusen" von fremden
HTML-Kode auf eine WWW-Seite. Damit kann ein Angreifer folgende Ziele verfolgen:
- Falsche Anzeige der WWW-Seite: Verunstaltung (z.B. unleserlich), Anzeige fremder Inhalte (Texte, Bilder)
- Ausspähen von Daten, z.B. Zugangsdaten (insb. Cookies), durch Einbringen von JavaScript-Kode
- Ausführen von fremden Programm-Kode (insb. JavaScript)
Betroffen von solchen XSS-Problemen sind prinzipiell alle PHP- und
CGI-Programme, die externe Parameter (wie Formulareingaben) verarbeiten, z.B.
Gästebücher, Such- oder Anmeldeformulare.
Betrachten wir zunächst ein schlechtes Beispiel:
<form action="..."><input name="name" ... /> ... </form>
<?php # Gib den eingetippten Namen aus:
print "Hallo " . $_REQUEST['name'];
?>
Unerwünschte Effekte treten ein, wenn der URL so aussieht:
.../script.php?name=<h1>Gross-und-fett
Dann würde durch die PHP-Anweisung ausgegeben:
Hallo <h1>Gross-und-fett
Das HTML-Tag <h1> würde die Ausgabe ganz empfindlich stören.
Natürlich könnten auch noch "wüstere" HTML-Tags (z.B. Laden externer Bilder) oder gar
JavaScript-Kode abgearbeitet werden.
Erinnern wir uns an obigen "Merksatz" - der kann nicht
oft genug genannt werden:
Vertrauen Sie keinen Werten, die über Browsereingaben, den URL oder Cookies
in das PHP-Skript gelangen.
Alle externen Parameter, selbst wenn sie aus versteckten Feldern
oder Auswahlmenüs kommen, müssen einer Plausibilitätsprüfung unterworfen werden,
bevor sie im Programm verwendet werden.
Also betrachten wir für unser Beispiel auch den Wert für
name kritisch:
<form action="..."><input name="name" ... /> ... </form>
<?php # Gib den eingetippten Namen aus
# evtl. HTML-Kode kodieren wir mit der Funktion htmlspecialchars:
print "Hallo " . htmlspecialchars($_REQUEST['name']);
?>
Wenn in diesem Fall der eingetippte Name HTML-Kode enthält, wird er
"unschädlich" gemacht. In obigem Beispiel wird ausgegeben:
Hallo <h1>Gross-und-fett
Und das bringt einen WWW-Browser nicht durcheinander - auch JavaScript
wird so unschädlich gemacht.
Alternativ können Sie die Funktion
strip_tags einsetzen, um alle HTML- und
PHP-Tags aus einer Zeichenkette zu entfernen.