Download 3. Auflage

Transcript
4.12 XSS verbieten, HTML erlauben – wie?
Beim Überfliegen des Abschnittes über das XSS Cheat Sheet haben
Sie vermutlich festgestellt, dass es eine große Zahl von Möglichkeiten
gibt, XSS-Angriffe auf Ihre Skripte auszuführen – und dass Sie mit
einem einzigen Filter nur eine kleine Untermenge dieser Angriffe finden
und entfernen können. Die ideale Strategie für einen XSS-Filter, der
selektiv HTML zulässt, wäre daher eine Whitelist, die ausschließlich
die Tags und Attribute im Quellcode belässt, die keinen schädlichen
Code enthalten können. Eine solche Whitelist wird von der Anwendung »HTML Purifier« implementiert, die wir Ihnen im nächsten
Abschnitt vorstellen. Für bestimmte Fälle kann es jedoch nützlich sein,
einen Blacklist-basierten HTML-Filter zu kennen, der als verdächtig
bekannte Elemente aus HTML-Code entfernt.
Bevor Sie die tatsächliche Entfernung XSS-verdächtiger Tags und
Attribute vornehmen, können Sie zunächst Ihre eigene Tag-Whitelist
erstellen, die nur gewollte HTML-Tags enthält. Nicht für Benutzereingaben sinnvoller Markup-Code wie <META>, <script> und <BODY> wird
dann von PHP entfernt.
Die PHP-Funktion strip_tags() verfügt über eine solche WhitelistFunktionalität, mit der Sie zunächst alle HTML-Tags entfernen können, die Ihr Skript nicht benötigt. Sie sollten jedoch darauf achten,
dass diese Funktion keine Syntaxprüfung vornimmt. Halboffene Tags
oder inkorrekte HTML-Syntax können dazu führen, dass mehr Inhalt
entfernt wird als erwartet.
Möchten Sie alle HTML-Tags bis auf <a>, <div>, <img> und <pre>
verbieten, erreichen Sie das mit dem Funktionsaufruf
$stripped_html = strip_tags($html, "<a><div><img><pre>");
Aus einem HTML-Block wie
<div> <a href="http://www.foobar.de/"> <u>foo</u> </a> <b>blah</b>
<pre>fasel</pre>
wird mit der oben genannten Funktion Folgendes:
<div><a href="http://www.foobar.de/"> <u>foo</u> </a>blahfasel
Nachdem Sie alle Tags entfernt haben, die in jedem Fall unerwünscht
sind, ist es Zeit, mit einem geeigneten Parser sämtliche restlichen unerwünschten Attribute und Tags zu entfernen. Die Klassensammlung
SafeHTML3 verfügt über einen solchen Parser auf Basis der PEARKlasse XML_HTMLSax34 und gilt als ein gutes Mittel gegen XSS.
3.
4.
http://pixel-apes.com/safehtml/
http://pear.php.net/package/XML_HTMLSax3
99