避免缓慢的正则表达式以及会导致服务瘫痪的灾难性回溯(ReDoS)。
大多数正则表达式都非常快,但某些模式的执行时间会随输入长度呈指数级增长。这被称为灾难性回溯,而用恶意输入让服务器停摆的攻击就叫 ReDoS(正则表达式拒绝服务)。
最常见的原因是嵌套的量词。像 (a+)+ 或 (.*)* 这样重复之中又叠着重复,一旦后面失败,引擎就会尝试所有可能的划分而爆炸。像 (a|a)* 这样的有歧义的交替也会引发同样的问题。
预防的核心是消除歧义。把重叠的重复合并为一个,用 [^x]* 之类缩小范围来代替 .*,并尽可能考虑原子组或占有量词(JavaScript 没有)。限制输入长度在实际工作中也很有效。
本测试器在浏览器中运行,所以危险的模式只会让你的标签页短暂变慢,但在把同样的模式用于服务器上不可信的输入之前,请务必检查性能。