答案 0 :(得分:2)
如果没有实际运行它,很难验证正则表达式是否是邪恶的。您可以尝试检测Wiki中详述的一些模式并概括它们:
e.g。对于
您可以检查)+
或)*
或){
序列并对其进行验证。但是,我保证攻击者会找到他们的方式。
本质上它是minefield to allow user set regexps。但是,如果您可以超时正则表达式搜索,则终止该线程,然后将该正则表达式标记为" bad"你可以稍微减轻威胁。如果以后使用regexp,也许你可以通过在入口点的预期输入上运行它来验证它吗?
稍后,如果在后期评估的文本与正则表达式具有不同的效果并将其标记为坏,则仍需要能够终止它,以便在没有用户干预的情况下不再使用它。
答案 1 :(得分:0)
TL; DR 排序,但不完全
In [9]: re.compile("(a+)+", re.DEBUG)
max_repeat 1 4294967295
subpattern 1
max_repeat 1 4294967295
literal 97
请注意那些嵌套的重复1..N ,对于大N来说,那是坏事。
除了(a|aa)+
和a*b?a*x
之外,它还会处理所有Wikipedia示例。
同样,如果您的引擎支持反向引用,则难以考虑反向引用。
IMO邪恶的正则表达式是两个因素的结合:组合爆炸和发动机实施中的疏忽。因此,最坏的情况还取决于正则表达式引擎和有时标志。回溯并不总是很容易识别。
然而,可以确定简单的案例。