Xss过滤器正则表达式错误的单词

时间:2016-06-03 09:44:41

标签: java regex xss

我找到了关于如何通过使用不同的正则表达式来选择脚本来实现xss过滤器的多个指南。但是我发现了一个评估eval()标记的缺陷。这个正则表达式eval.*?\((.*?)\)将选择eval标签,但也会选择评估或中世纪等词。

关于如何让这个正则表达式更好的任何想法?

2 个答案:

答案 0 :(得分:1)

正则表达式的匹配超出预期,因为左侧没有单词边界检查,右侧的懒惰点匹配模式允许除换行符之外的任何零个或多个字符。

所以要仅匹配eval(...),请使用

\beval\((.*?)\)

甚至

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

答案 1 :(得分:0)

这种过滤器很可能在其他几种方面存在缺陷。首先,它不必是eval("something")。它也可以是evalx("something"),其中x可以是ascii 9,10,11,12,13或32(以及可能还有其他unicode值)。因此,对于instace eval ("something")仍在运行。其次可以是window["eval"]("something")window["EVAL".toLowerCase()]("something")window["e" + "val"]("something"),或window["ev\61l"]("something")等等。

通过输入验证停止XSS非常困难,因为它取决于数据的输出位置(上下文)。有关示例,请参阅OWASP XSS Prevention Cheat Sheet