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