这是W3C HTML spec建议用于电子邮件验证的正则表达式模式:
^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$
SonarQube将其标记为“容易受到拒绝服务攻击(ReDOS)”。 我认为这是一个错误的肯定,但是我不是该领域的专家,所以我可能会漏掉一些东西。
我相信Sonar认为由于嵌套重复-组中包含[a-zA-Z0-9-]{0,61}
,后跟星号,它可能会受到ReDoS攻击。但是,我仍然认为,当正则表达式引擎回溯此表达式时,它可以快速解决该问题,因为以后可以预期该行的点或结尾。我的推理正确吗?
答案 0 :(得分:3)
声纳不是那么聪明。它看到包含量化模式的量化组。尽管这是发生ReDoS攻击的主要原因,但这还不够。
有问题的可疑正则表达式有一个边界:
[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*
^
该边界使失败更早发生(请参阅happens without it)。如果没有,那我们可以说声纳是百分之一百正确的。您的推论是正确的。