XSS erfolgreich verhindern

XSS, kurz für Cross Site Scripting, ermöglicht es einem Angreifer Browser-Code in die Seite einzubauen. Dadurch kann z.B. auf anderen Clients Javascript ausgeführt werden, die Same-Origin-Policy umgangen werden und Daten abgegriffen werden.

Wie funktioniert XSS?

Stellen wir uns beispielsweise eine Kommentier-Seite vor: Es werden Kommentare von Nutzern angezeigt. Nicht eingeloggte Nutzer können durch Eingabe ihrer Zugangsdaten auch einen Kommentar hinterlassen. Unser Angreifer möchte die Zugangsdaten der User gerne mitlesen. Dazu könnte unser Angreifer ein Kommentar mit einem Javascript posten, welches Formulardaten per AJAX an seinen Server sendet.

XSS kann aber auch ganz einfach genutzt werden um COOKIE-Inhalte abzugreifen. Dadurch kann eine Session übernommen werden.

Auch HTML-Tags könnten so genutzt werden, um das Layout zu brechen oder neue Formulare hinzufügen.

Dieser Angriff könnte aber auch genutzt werden, um DDOS-Attacken auszuführen indem die Browser von nichts ahnender User für viele Ajax-Requests genutzt werden.

XSS ist eine große und reelle Gefahr. Selbst die Seiten von CIA, FBI und Facebook sind schon Opfer geworden.

Gegenmaßnahmen

Die oberste Regel heißt: Wir trauen keinen fremden Daten!

Ausgaben escapen

Alle Variablen die wir ausgeben möchten, die nicht im Sourcecode gesetzt wurden, sondern aus einer Fremdquelle stammen (DB, API, Form-Input, etc), müssen escaped werden.

echo htmlentities($kommentar);

Frameworks bieten für Views in der Regel eine Funktion aus. In Zend Framework 2 z.B.:

echo $this->escapeHtml($kommentar);

Sanitizer nutzen

Manchmal muss user-generiertes HTML korrekt dargestellt werden, oder ungültige Inhalte sollen einfach ignoriert werden. Dann kann z.B. der HTMLPurifier genutzt werden. Dieser hilft dabei zwischen erlaubten Tags und unerlaubten zu unterscheiden. Außerdem können, und sollten, auch die Attribute gefiltert werden. Wir möchten natürlich kein “onClick”, etc. zulassen.

Inline Script (und CSS) komplett verbieten

Eine neuere und radikale Lösung ist es, Inline Script und CSS komplett zu unterbinden. Das System nennt sich Content Security Policy. Dazu wird ein HTTP-Header gesetzt. Die Browser-Unterstützung ist zwar OK, aber nicht vollständig. Dieses System sollte niemals als alleiniger Schutz genutzt werden!

Ein Gedanke zu „XSS erfolgreich verhindern

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert