Xss Filter Regex 捕获错误的词

Xss Filter Regex catching the wrong words

我找到了多个关于如何通过使用不同的正则表达式来挑选脚本来实现 xss 过滤器的指南。但是我在评估 eval() 标签的代码中发现了一个缺陷。这个正则表达式 eval.*?\((.*?)\) 将挑选出 eval 标签,但也会挑选出诸如 evaluate 或 medieval 之类的词。

关于如何改进此正则表达式的任何想法?

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

所以只匹配eval(...),使用

\beval\((.*?)\)

甚至

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

此过滤器很可能在其他几个方面存在缺陷。首先,它不一定是 eval("something")。它也可以是 evalx("something"),其中 x 可以是 ascii 9、10、11、12、13 或 32(也可能是其他 unicode 值)。因此,例如 eval ("something") 仍然运行。其次它可以是 window["eval"]("something")window["EVAL".toLowerCase()]("something")window["e" + "val"]("something"),或 window["evl"]("something") 等等。

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