Bei der Erstellung von sicheren Webanwendungen ist das Verhindern von Cross Site Scripting (kurz XSS genannt) eine zentrale Anforderung.
XSS bezeichnet das Einschleusen von gefährlichen Inhalt in eine Webanwendung, der z.B. bei der Ausgabe dazu führt das bestimmte HTML oder JavaScript Anweisungen die Seite verändern, Daten auslesen, fremde Seiten einbinden etc.
Ein typischer und einfacher Vorgang ist z.B. die Eingabe von HTML Anweisungen in Formularfelder. Werden die Eingaben später ohne Maskierung ausgegeben, kann ein Angreifer Code einschleusen.
Beispiel: Ein Text Eingabefeld „GLOBAL:Name“ wird an den Server übermittelt, dieser gibt dann die Meldung „Hallo $GLOBAL:Name“ aus.
Gibt man nun im Namen „<script>alert(`Hallo`);</script>“ ein, führt das dazu das bei der Ausgabe ein möglicherweise schädliches JavaScript ausgeführt wird, da der Browser denkt, dieses sei in Ordnung, da es ja vom selben Server kommt.
Die einzige wirklich wirksame Methode gegen XSS ist es, konsequent potentiell unsicheren Inhalt vor der Ausgabe zu maskieren. Im obigen Beispiel also die gefährlichen Zeichen < > und ` durch die entsprechenden HTML Entitäten wie < > " zu ersetzen.
Eine Prüfung der Eingabe allein ist keine wirksame Maßnahme gegen XSS. Die möglichen Angriffsvektoren sind einfach zu vielfältig und hängen zudem stark von der Verarbeitung und Ausgabe der Daten ab.
Die DLE bietet für das Maskieren einige Möglichkeiten. Im Basispaket gibt es ein Kommando „Zeichenkette Maskieren“, mit der man manuell eine Zeichenkette je nach Inhalt maskieren kann.
Einfacher ist jedoch die Verwendung spezieller Maskierungsanweisungen im Text selber. Ähnlich wie die Übersetzung mittels @@ Maskierung gibt es in der DLE im Webumfeld die Möglichkeit, mit folgenden Maskierungen zu arbeiten:
- @H{....}@
- @A{....}@
- @C{....}@
- @J{....}@
- @U{....}@
- @X{....}@
- @!{....}@
Diese Maskierungen maskieren nach bestimmten Regeln für: HTML Daten, HTML Attribute (strikter als HTML, eignet sich auch für Attributdaten die ohne Anführungszeichen benutzt werden), CSS Werte, JavaScript Zeichenketten, URL Daten, XML Daten. Dabei wird der Text zwischen den geschweiften Klammern entsprechend maskiert. Die Begrenzer werden dann entfernt. Einen Sonderfallt stellt das @! Muster dar, hier werden die Daten nicht maskiert, sondern verschlüsselt und die Maskierung wird nicht entfernt. Siehe Kapitel 13 (Kryptografie im Web).
Die Maskierung kann auch ganz einfach im Brickeditor in der Feldauswahl gewählt werden. Dazu ist das Häkchen „Erweiterte WEB-Optionen“ oben im Editor anzuhaken. Dann kann die gewünschte Maskierung einfach vorgegeben werden.
Für die Ausgabe von Text, der aus unsicheren Quellen stammt, gibt es zudem das HTML Kommando „Label“. Dieses HTML-maskiert den kompletten Text und gibt ihn im HTML Dokument aus.
Die DLE maskiert zudem automatisch dort, wo kein HTML oder JavaScript Markup erwartet wird. Wie z.B. bei den Parametern für ID, CSS Style, Tooltip, HTML Klassen, Namen, Werte etc.
