首页 > 解决方案 > std::regex 构造函数安全吗?

问题描述

只是为了确保:
的构造函数std::basic_regex必须检测无效表达式,如果不正确则抛出异常。正确的?因此,假设我信任我的 STL 实现者,我可以将任意字符串传递给它,我将获得一个有效的正则表达式对象或异常——没有 UB 或类似的东西?

有谁知道std::basic_regex对错误输入不健壮的错误实现(编辑:或正则表达式库的其他部分)?

标签: c++

解决方案


假设标准库没有错误(正如 PW 所指出的那样),存在一种更普遍的攻击,称为 ReDoS,如OWASP所述:

正则表达式拒绝服务 (ReDoS) 是一种拒绝服务攻击,它利用了这样一个事实,即大多数正则表达式实现可能会遇到极端情况,导致它们工作非常缓慢(与输入大小呈指数相关)。然后,攻击者可以使使用正则表达式的程序进入这些极端情况,然后挂起很长时间。

所以我至少会限制允许输入的大小,这样你的程序就不能被 DOS 了。其次,测试引擎鲁棒性的一般方法是通过模糊测试。那里有各种各样的模糊测试库和 GitHub 上的一些项目,其中包含明确用于笔测试的“顽皮”字符串。您可能会发现对各种引擎进行模糊测试以查看它们失败的位置是值得的。


推荐阅读