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’)