XSS

Was ist Cross-Site-Scripting?

Ein Angreifer kann über einen präparierten Link oder ein präpariertes Webformular HTML- oder JavaScript-Code im Kontext der verwundbaren Seite auf dem Rechner des Opfers ausführen. S. a. Wikipedia-Eintrag.

Wenn ein präparierter Link für diesen Angriff notwendig ist, dann könnte der Angreifer den Code gleich von dort ausführen lassen und ist auf die verlinkte Seite gar nicht angewiesen!?

Dann würde der Code aber nicht im Kontext dieser Seite ausgeführt. Da Cookies in der Regel nur an eine bestimmte Domain gesendet werden, könnte ein Angreifer so nicht an diese gelangen.

Ich bin immer noch nicht davon überzeugt, dass es sich tatsächlich um ein praktisch relevantes Problem handelt. Schließlich habe ich noch nie davon gehört.

Andere schon.

Wie kann ich als Autor einer Seite einen XSS-Angriff verhindern?

Bei der Ausgabe von Variablen, die HTML enthalten könnten (im Prinzip alle), sind Zeichen mit besonderer Bedeutung durch deren entsprechende HTML-Notation zu ersetzen. In PHP erledigt man das mit htmlspecialchars. In anderen Sprachen wie Perl existieren entsprechende Funktionen (CGI::escapeHTML) oder man kann sich leicht selbst etwas bauen:

sub htmlspecialchars {
    $f = $_[0];
    $f =~ s/&/&/g;
    $f =~ s/</&lt;/g;
    $f =~ s/>/&gt;/g;
    $f =~ s/\"/&quot;/g;
    return $f;
}

Bei dieser Gelegenheit kann man sein Skript auch mal auf Sicherheit gegen SQL-Injektion überprüfen.

Nicht vergessen: Zeichenketten in URLs sind anders zu kodieren (PHP: urlencode, Perl: URI::Escape). Auch hier droht ein XSS-Angriff, falls die Kodierung nicht richtig durchgeführt wird! In Perl:

sub urlencode {
    $f = $_[0];
    $f =~ s/([^-_. A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
    $f =~ s/ /+/g;
    return $f;
}

Ich betreibe ein Login-System, welches Cookies verwendet. Wie kann ich es sicherer gegen Cookieklau mittels XSS machen?

Man könnte optional oder für bestimmte Netzbereiche die Berechtigung des Cookies an die IP-Adresse des Clients koppeln.

Die HttpOnly-Erweiterung für Cookies verwenden.

Bei Verwendung von HTTPS das Secure-Attribut von Cookies verwenden.