Verhindern von DOM XSS

8

Wir haben vor kurzem den Code von jemand anderem betreten, der inzwischen für DOM-XSS-Angriffe getestet wurde und fehlgeschlagen ist. Im Grunde werden die URL-Fragmente direkt in jQuery-Selektoren übergeben und das Einfügen von JavaScript ermöglicht:

%Vor%

Das Problem besteht darin, dass dies in allen Skripts auftritt und viele Regressionstests erforderlich wären, um z. wenn wir den Daten entkommen, wenn die Anweisungen nicht mehr wahr werden, weil die Daten nicht übereinstimmen.

Die betreffende JavaScript-Datei wird zum Zeitpunkt der Erstellung von vielen kleineren Dateien verkettet, so dass dies noch schwieriger zu beheben ist.

Gibt es eine Möglichkeit, diese DOM XSS-Angriffe mit etwas globalem Code zu verhindern, ohne jede Instanz durchlaufen und debuggen zu müssen.

Ich habe vorgeschlagen, dass wir am Anfang des Skripts einen kleinen regulären Ausdruck hinzufügen, um gängige Zeichen in XSS-Angriffen zu erkennen und das Skript einfach zu beenden, wenn es true zurückgibt.

%Vor%

Das scheint zu funktionieren, aber ich bin nicht 100% glücklich mit der Lösung. Hat jemand eine bessere Lösung oder einen nützlichen Einblick, den sie anbieten können?

    
sidonaldson 08.11.2012, 10:57
quelle

2 Antworten

6

Wenn Sie sich an die Lösung für reguläre Ausdrücke halten, die weit davon entfernt ist, ideal zu sein, aber angesichts Ihrer Einschränkungen die beste Wahl ist:

Anstatt einen regulären Ausdruck zu definieren, der mit bösartigen Hashes übereinstimmt ( /(javascript|src|onerror|%|<|>)/g ), würde ich einen regulären Ausdruck definieren, der Sound-Hashes entspricht (z. B. /^[\w_-]*$/ ).

Es vermeidet falsch positive Fehler (z. B. src_records ), macht deutlich, was autorisiert ist und was nicht, und blockiert komplexere Injektionsmechanismen.

    
Julien Royer 08.11.2012, 14:53
quelle
0

Ihr Problem wird dadurch verursacht, dass die Eingabezeichenfolge von jQuery nicht nur als Selektor, sondern auch als HTML behandelt wird.

Verwenden Sie native document.querySelector() anstelle von jQuery.

Wenn die Unterstützung für IE7 für Sie wichtig ist, können Sie die Sizzle Selector-Engine ausprobieren, die wahrscheinlich im Gegensatz zu jQuery und ähnlich wie native querySelector() ist. , interpretiert die Eingabezeichenfolge nicht als etwas anderes als ein Auswahlelement.

    
Marat Tanalin 08.11.2012 14:35
quelle

Tags und Links