Regex安全问题
主题
正则表达式(4)
Regex安全问题
Regex DOS (ReDOS)
正则表达式(Regex)经常遭受拒绝服务(DOS)攻击(称为ReDOS)。这是由于以下事实:根据特定的正则表达式定义,正则表达式引擎在分析某些字符串时可能会花费大量时间。
例如,对于正则表达式:^(a+)+$
,输入“aaaaaaaaaaaaaaaaaaaaX
”会导致正则表达式引擎分析65536个不同的路径。[1]取自OWASP
参考的示例
因此,单个请求有可能在服务器端引起大量计算。这个正则表达式和其他类似正则表达式的问题是,由于括号内的 “+
”(或 “*
”),因此正则表达式可以通过两种不同的方式来接受相同的输入字符(或 “*
”)放在括号之外。编写方式上,任意 “+
” 都可以使用字符 “a
”。要解决此问题,应重写正则表达式以消除歧义。例如,可以将其简单地改写为:“^a+$
”,想必这就是作者的意思(任何数量的 a
)。假设这就是原始正则表达式的含义,则可以快速评估此新正则表达式,并且不受ReDOS
的约束。
[1] OWASP: Regular expression Denial of Service
CWE-400: Uncontrolled Resource Consumption (‘Resource Exhaustion’)