O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

4 Cross-Site Scripting94
den, Groß- und Kleinschreibung lassen sich variieren – so wird aus
dem Zeichen »<« sowohl
&#60; als auch &#X000003C;. Die Standard-
konformität der Mozilla-Browser wird ihnen nun zum Verhängnis:
Während der Internet Explorer sich bei der Hälfte der codierten Zei-
chen ahnungslos gibt, zeigt Firefox 65 von 70 laut XSS Cheat Sheet
möglichen Zeichenketten klaglos als Kleiner-Zeichen an.
Wenn Sie mittlerweile etwas die Übersicht verloren haben, auf wel-
che Arten ein Angreifer XSS in Ihrer PHP-Anwendung durchführen
kann: Das war Absicht und sollte Ihnen verdeutlichen, dass ein Filter
nicht permissiv, sondern restriktiv agieren sollte. Sie können nämlich
auch sicher sein, dass in der schnelllebigen Browserwelt die funktionie-
rende Blacklist von heute spätestens mit der nächsten Browserversion
total veraltet sein wird.
4.11 Einfache Gegenmaßnahmen
XSS begegnen Sie wie fast jeder anderen Lücke in PHP-Skripten auch:
Sie filtern einfach sämtlichen Input ausreichend. Klingt doch gar nicht
so schwer, oder? Im Grunde ist es das auch nicht – man muss nur kon-
sequent durchhalten; XSS ist einfach nur ein weiteres Metazeichenpro-
blem.
Standardkonform bleiben!
Die erste Regel im Kampf gegen XSS hat mit PHP zunächst gar
nichts zu tun, ist aber dennoch unverzichtbar: Halten Sie sich an Stan-
dards! Wenn Sie HTML-Tags mit Attributen versehen, verwenden Sie
stets einfache oder doppelte Anführungszeichen, das erschwert die
üblichen XSS-Injections erheblich. Geben Sie etwa Werte aus einem
Formular nach einer inhaltlichen Überprüfung an das folgende Formu-
lar (z.B. im Fehlerfall oder für mehrstufige Formulare) weiter, ohne die
Werte in
"" einzuschließen, kann ein Angreifer mit einem Wert wie
blah+attribut=wert neue Attribute hinzufügen.
HTML ist oft überflüssig
Erhalten Sie Daten vom Benutzer über ein Formular, so ist es nur
in den seltensten Fällen notwendig, dass der Formularinhalt HTML-
oder Skriptcode enthält. Für Kontakt- oder Suchformulare oder die
Änderung der eigenen Kundendaten ist kein HTML notwendig, es
kann also schlicht weggeworfen werden.
PHP kennt hierfür eine Funktion, die radikal alles, was nach einem
HTML-Tag, eigentlich sogar alles, was nach einem SGML-Tag aus-
sieht, aus einem String entfernt. Diese Funktion heißt passenderweise
strip_tags(), ihre zwei Argumente sind der zu bereinigende String
sowie alle erlaubten HTML-Tags.
3-2>=I?,/<8=98./<8+,6/28/82/3G>.3//@3=/
954.11 Einfache Gegenmaßnahmen
Der String
"><script>alert("XSS!")</script>
ist ein typisches Beispiel für einen XSS-Angriff und würde ungefiltert
dafür sorgen, dass ein beliebiges HTML-Attribut und das dazugehö-
rige HTML-Tag geschlossen werden. Nach der Behandlung mit
strip_tags() bleibt noch folgende Zeichenkette übrig:
">alert("XSS!").
Damit sind zumindest die aktiven Komponenten des XSS-Angriffs
gefiltert – es gibt keinen Browser, der ohne umschließende
<script>-
Tags aktiven Code ausführt.
Sonderzeichen filtern
Im zweiten Schritt sollten Sie noch vorhandene Sonderzeichen wie
einzelne Klammern <>, Anführungszeichen etc. entweder ganz entfer-
nen, wo möglich, oder mit der PHP-Funktion
htmlentities() in ihre
HTML-Entitäten umwandeln. So verhindern Sie unter anderem, dass
Angreifer Ihr HTML durcheinanderbringen, indem sie etwa Tags früh-
zeitig schließen und Attribute mit
"" abschneiden. Anders als vielleicht
vermutet, reicht nämlich das automatisch über PHPs »Magic Quoting«
vorgenommene Escapen von einfachen und doppelten Anführungszei-
chen nicht aus, um das böswillige Schließen von HTML-Attributen zu
verhindern.
Auch hier soll ein kurzes Beispiel Klarheit schaffen: Stellen Sie sich
vor, Ihr Eingabeformular für Kundendaten enthält eine Fehlerüberprü-
fung, die dem Nutzer den eingegebenen Wert nochmals zur Bestäti-
gung anzeigt, und zwar innerhalb des Eingabefeldes. Der HTML-
/PHP-Code für dieses Feld könnte folgendermaßen aussehen:
<input type="text" name="vorname" value="<?php $_GET['vorname'] ?>">
Was passiert nun, wenn der böswillige Nutzer als Vornamen den oben
eingeführten XSS-Test-String eingibt? Das Ergebnis ist klar – das
HTML-Tag <input> wird geschlossen, und die Eingabe »wuchert« in
einen Bereich, in dem sie nicht erwünscht ist.
Obgleich hier dank
strip_tags() kein fremder Skriptcode zur Aus-
führung kommt, kann eine derartige Lücke genutzt werden, um
fremde Inhalte in Ihre Webseite einzufügen und sie so umzugestalten –
zu » defacen «, wie derlei Aktionen im Jargon bezeichnet werden.
Im String enthaltene Anführungszeichen müssen demnach vor der
Weiterverarbeitung (also insbesondere der Speicherung oder Ausgabe)
entschärft werden, um XSS zu vermeiden. Der zugehörige Aufruf von
htmlentities() sieht so aus:
$str = htmlentities($str);

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required