2016-08-04 11 views
1

Ich habe folgenden Fluss: eine URL mit Abfrage-Parametern, die ein gewisse Logik auf der Server-Seite läuft, und erzeugen dann mitXSS verhindern zu JS-Code-Datei übergebenen Parameter

    einem Template-Engine eine Stub-HTML-Seite mit
  • Eine JavaScript-Datei enthalten, die die Hauptlogik ausführt.
  • <script> Tag, das ein JS-Objekt enthält, das Parameter zu diesem JS-Code enthält, die teilweise aus den Abfrageparametern stammen.

Jetzt möchte ich die Parameter sanieren I erhalten, XSS Injektion zu verhindern. Das Problem, dass einer der Parameter ein Token ist, also möchte ich nicht zu streng auf die Validierungen sein (einfach nicht alle möglichen XSS-Zeichen zuzulassen klingt zu streng), aber die meisten Bibliotheken, mit denen ich zu tun habe reiner HTML-Code und kein JS-Code (innerhalb <script> Tags). Ich fühle mich auch ein bisschen unwohl, wenn ich die ganze Regex-Lösung lese, weil ich gewohnt bin, Open Source Bibliotheken im Umgang mit Sicherheit zu vertrauen (die Unit-Tests haben und nicht eine Reihe von Regex).

Irgendwelche Hinweise zu Bibliotheken & möglicher Ansatz? Wir laufen in JVM-Umgebung.

+0

Ich denke, Sie könnten HTML-Code für Ihre Abfrage String-Parameter, dann können Sie sie sicher in Ihre HTML-Response-Seite anzeigen. In Java können Sie org.apache.commons.lang.StringEscapeUtils verwenden –

+0

So übergeben Sie die URL-Parameter als Werte eines JS obejct Eigenschaften, ist das korrekt? – mjsarfatti

+0

@mjsarfatti Das ist richtig –

Antwort

2

Der einfachste, einfachste und daher sicherere Ansatz besteht darin, data attributes zu verwenden, um die dynamischen vom Benutzer bereitgestellten Werte darzustellen.

Auf diese Weise müssen Sie sich nur um HTML-Codierung kümmern, keine der komplexen Hexentität Codierung (\x00), die OWASP recommend.

Zum Beispiel könnten Sie haben:

<body data-token="@param.token" /> 

Wo @param.token ausgeben wird eine HTML-Version der Abfrage-String-Parameter codiert. z.B. page?token=xyz" würde Ausgang

<body data-token="xyz&quot;" /> 

Dies wird Ihre XSS-Schwachstelle Sorge mildern.

Dann können Sie so etwas wie JQuery to easy retrieve the data attribute values in your JavaScript verwenden:

var token = $("body").data("token"); 

Einfach und sicher.

+0

OP, wenn Sie folgen dem oben genannten, achten Sie darauf, wie 'token' dann verwendet wird. Es ist nicht magisch sicher für alle clientseitigen JavaScript-Verwendungen. Wenn es in' $ ("foo") .html (token) 'oder irgendwas endet Von den anderen unzähligen unsicheren Methoden sind Sie dann anfällig für ein DOM-basiertes XSS-Problem anstelle Ihres ursprünglichen reflektierten XSS-Problems. – coastalhacking

1

Imagining Sie Ihre Parameter als String zugewiesen werden soll, wie zum Beispiel:

{ 
    ... 
    x: '[PARAMETER]' 
} 

Sie wollen sicherstellen, dass [PARAMETER] nicht aus der Zeichenfolge in Anführungszeichen nicht bricht.

In diesem Fall müssen Sie das '-Zeichen und das schließende </script>-Tag zurückgeben. Hinweis: Berücksichtigen Sie "Escape-The-Escape" -Angriffe, bei denen der Angreifer die Zeichenfolge \' sendet, die als \\' maskiert ist, die wiederum in ' zurückkehrt (und Sie sind zurück von Ihrem Ausgangspunkt).

Es ist im Allgemeinen einfach sicherer, als OWASP Notizen,

Flucht alle Zeichen weniger als 256 mit dem \ xHH Format

Ich lade Sie die OWASP Seite auf XSS-Angriffe zu lesen, und insbesondere https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.233_-_JavaScript_Escape_Before_Inserting_Untrusted_Data_into_JavaScript_Data_Values

+1

Dieser Ansatz ist leider anfällig dafür, dass ein Angreifer '' ausbricht, um aus dem Skript-Tag auszubrechen. Der Angreifer kann dann seine Zeichenfolge mit einer anderen "