c++ - std::regex 构造函数安全吗?
问题描述
只是为了确保:
的构造函数std::basic_regex
必须检测无效表达式,如果不正确则抛出异常。正确的?因此,假设我信任我的 STL 实现者,我可以将任意字符串传递给它,我将获得一个有效的正则表达式对象或异常——没有 UB 或类似的东西?
有谁知道std::basic_regex
对错误输入不健壮的错误实现(编辑:或正则表达式库的其他部分)?
解决方案
假设标准库没有错误(正如 PW 所指出的那样),存在一种更普遍的攻击,称为 ReDoS,如OWASP所述:
正则表达式拒绝服务 (ReDoS) 是一种拒绝服务攻击,它利用了这样一个事实,即大多数正则表达式实现可能会遇到极端情况,导致它们工作非常缓慢(与输入大小呈指数相关)。然后,攻击者可以使使用正则表达式的程序进入这些极端情况,然后挂起很长时间。
所以我至少会限制允许输入的大小,这样你的程序就不能被 DOS 了。其次,测试引擎鲁棒性的一般方法是通过模糊测试。那里有各种各样的模糊测试库和 GitHub 上的一些项目,其中包含明确用于笔测试的“顽皮”字符串。您可能会发现对各种引擎进行模糊测试以查看它们失败的位置是值得的。
推荐阅读
- scala - Scala过滤多个条件
- aws-lambda - 无服务器 wsgi 无法导入 werkzeug
- azure - Azure 应用服务计划选择多对一计划
- python - 模型预测的值与训练的值相似是否正常?
- angular - 未设置角度 ng-pristine ng-invalid ng-valid 类
- magnolia - 获取 magnolia 中组件的父页面节点
- javascript - d3 树形图工具提示的自定义样式
- python-3.x - NameError:名称“*”未定义
- typescript - 如何禁用@typescript-eslint/no-non-null-assertion 规则
- laravel - Laravel - 从本地化文件中获取错误消息