Was ist Cross-Site-Scripting (XSS)?

Heute aus der Reihe Sicherheitsrisiken einer Webanwendung: Cross-Site-Scripting (XSS). Was ist das? Was ist das Risiko? Was können wir als Entwickler dagegen tun?

XSS: Was ist das eigentlich?

Beim Cross-Site-Scripting fügt ein Angreifer schadhaften Code in unsere Webseite ein. Schadhafter Code ist den meisten Fällen ein kleines JavaScript-Programm.

Die Problematik ist, dass dieser Code im Browser eurer normalen Nutzer ausgeführt wird. Ist der Nutzer eingeloggt, hat es somit Zugang zu seinem Account und alle seine Rechte. Hier kann es also beliebige Aktionen im Namen des nichts ahnenden Nutzers durchführen.

Betreibt ihr einen Webshop, kann ein Angreifer zum Beispiel im Namen eurer Nutzer Bestellungen durchführen und eine Menge Chaos anrichten. Eurer Kreativität sind hier de-facto keine Grenzen gesetzt.


Wie wird der notwendige Code eingeschleust?

Zunächst muss ein Angreifer seinen Code irgendwo eingeben können und euch zur Speicherung bewegen. Dazu eignet sich jedes Formular auf eurer Seite. Damit aber anschließend auch was passiert, muss der Inhalt des Formulars auch wieder auf eurer Seite angezeigt werden.

Die Kommentarfunktion hier im Blog ist das perfekte Beispiel für so ein Formular. Ihr könnt hier eingeben was ihr wollt (also auch JavaSript-Code) und genau das wird anschließend allen Besuchern dieser Seite angezeigt.


Wie verhindern wir Cross-Site-Scripting?

Bei der Eingabe müssen wir nichts weiter beachten. Erst bei der Ausgabe müssen wir darauf achten, dass aus harmlosem Text kein Skript wird, dass der Browser ausführt. Wir müssen also die entsprechenden Zeichen entfernen.

PHP bietet hierzu verschiedene Möglichkeiten:

Entfernen der Tags mit strip_tags()

Mit strip_tags() entfernen wir alle HTML-Tags aus dem Text. In diesem Fall können wir allerdings nicht dafür garantieren, dass der angezeigt Text noch im Sinne des Erstellers ist. Hier im Blog wollt ihr ja vielleicht wirklich ein Code-Beispiel posten.

Codieren der Zeichen mit htmlspecialchars()

Den ursprünglichen Text erhalten können wir indem wir lediglich die Zeichen, die vom Browser als Anweisung interpretiert würden, umschreiben. Dazu verwenden wir htmlspecialchars().

Damit werden alle HTML-Steuerzeichen „entschärft“. Aus & wird also &amp; und aus <script> wird &lt;script&gt;.

Nicht zu verwechseln ist htmlspecialchars() übrigens mit htmlentities(). Bei letzterer werden alle Zeichen umgewandelt, die eine codierte Schreibweise haben. Hier würde dann auch ein harmloses ü zu &uuml;. Dies hat nichts mit XSS zu tun und sollte daher nicht verwendet werden.


Hier geht’s zu den anderen Artikeln zum Thema Sicherheitsrisiken einer Webanwendung.