2016-06-03 4 views
0

Ich habe mehrere Anleitungen gefunden, wie man einen XSS-Filter implementiert, indem man verschiedene reguläre Ausdrücke benutzt, um Skripte auszuwählen. Aber ich habe einen Fehler in dem gefunden, der das eval() -Tag auswertet. Dieser Regex eval.*?\((.*?)\) wird das eval -Tag auswählen, aber auch Wörter wie evaluate oder medieval auswählen.Xss Filter Regex fängt die falschen Wörter ein

Irgendwelche Ideen, wie ich diese Regex besser machen kann?

+0

Verwenden Sie '\ beval \ ((. *?) \)', Um nur Eval-Vorkommen zu finden –

Antwort

1

Die Regex stimmt mehr als erwartet überein, da auf der linken Seite keine Überprüfung der Wortgrenzen und auf der rechten Seite das Übereinstimmungsmuster für faule Punkte keine oder mehrere andere Zeichen als eine neue Zeile erlaubt.

So nur eval(...) entsprechen, verwenden

\beval\((.*?)\) 

oder sogar

\beval\(([^()]*)\) 
0

Dieser Filter wird sehr wahrscheinlich in mehrere andere Möglichkeiten fehlerhaft. Zuallererst muss es nicht eval("something") sein. Es kann auch evalx("something") sein, wobei x 9, 10, 11, 12, 13 oder 32 (und möglicherweise auch andere Unicode-Werte) sein können. Also für Instanz eval ("something") läuft noch. Zweitens könnte es window["eval"]("something") oder window["EVAL".toLowerCase()]("something") oder window["e" + "val"]("something") oder window["ev\61l"]("something") und so weiter sein.

Das Beenden von XSS durch Eingabevalidierung ist sehr schwierig, da es davon abhängt, wo die Daten ausgegeben werden (der Kontext). Beispiele finden Sie in der OWASP XSS Prevention Cheat Sheet.