为何正则表达式/<[^>]*?>/g被CodeQL标记为多项式正则?
关于正则表达式
<[^>]*?>被CodeQL警告的原因分析 你的正则<[^>]*?>本身不存在灾难性回溯或多项式性能风险,CodeQL的警告更像是规则的泛化误报,原因如下:
正则的实际行为:这个正则的逻辑是匹配以
<开头,接着匹配任意**非>字符**([>]`是排除型字符集,只会匹配不是>`的内容),最后以>`结尾。非贪婪量词`*?`在这里并不会引发回溯——因为`[>]已经限定了匹配范围,只要遇到>就会立刻终止当前匹配,整个过程是线性遍历输入文本,时间复杂度是O(n),完全没有回溯分支。CodeQL的规则逻辑:CodeQL的警告规则可能对包含
.*?这类非贪婪量词的正则做了泛化标记,认为在非受控数据上使用这类模式可能存在性能问题。但它没有识别到你这里用了[^>]这个限定性字符集,彻底避免了回溯的可能。验证依据:你在测试中没发现性能问题是合理的——即使输入超长的无>
文本,这个正则也只会快速匹配到文本末尾(因为找不到>,不会产生任何回溯分支);如果是正常的HTML标签文本,匹配过程更是高效。
结论:这个警告属于误报,你的正则在处理标签文本时是安全高效的。
内容的提问来源于stack exchange,提问作者Allan Jardine
相关产品推荐
相关产品推荐

