> 注意包含嵌套的不定重复的模式。当应用于不匹配的字符串时,这些模式可能需要很长时间才能运行。
说它需要“很长时间”是轻描淡写:所需时间将呈指数增长,具体为 2^n,其中 n 是“a”字符的数量。如果在用户提供输入上运行此类表达式,则此行为可能导致“正则表达式拒绝服务”(ReDoS)。
为避免受到 ReDoS 的影响,请执行以下三件事之一(或可能不止一件)
* 编写您的表达式使其不受影响。 https://regexper.cn/redos.html 是一个很好的资源(PHP/PCRE 中提供了“原子”和“独占”选项)。如果您的肉眼无法发现所有问题,请使用“ReDoS 检测器”或“正则表达式 linter”。
* 为 preg_match 设置一些限制。在 https://php.net/manual/en/pcre.configuration.php. 上提到的值上使用 `ini_set(...)`。降低限制可能会导致正则表达式失败,但这通常比使整个服务器停滞更好。
* 使用不同的正则表达式实现。过去曾经有一个 RE2 扩展;现在没有了!