c++ - std::regex 对于用户定义的表达式是否安全?
问题描述
使用用户定义的表达式是否安全std::regex
(例如用于服务器端搜索)?标准库是否对损坏表达式的安全性做出任何保证?
解决方案
该标准要求当传递的正则表达式无效时,实现会引发错误。
explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
要求:
p
不得为空指针。抛出:
regex_error
ifp
不是有效的正则表达式。效果:构造类 basic_regex 的对象;
charT
对象的内部有限状态机由包含在长度为 的数组中的正则表达式构成,该数组的char_traits<charT>::length(p)
第一个元素由 指定p
,并根据标志进行解释f
。确保:
flags()
返回f
。mark_count()
返回表达式中标记的子表达式的数量。
甚至还有一张表格详细说明了可能出现的不同类型的错误。
因此,只要您不传递空指针,从用户提供的字符串创建正则表达式就不应该有未定义的行为。
请注意,任何实际实现当然可能仍然存在可能导致安全漏洞的错误。该标准显然也不能保证恶意用户无法通过提交一个非常复杂/自引用的正则表达式来拒绝您的系统,该正则表达式会产生太多的匹配,使用太多的内存/CPU 等,所以你必须自己考虑一下。但是如果你只是担心一个无效的正则表达式是否会导致 UB,答案是“不,你很好”。
推荐阅读
- python-3.x - 用于鸢尾花 ValueError 的简单估算器的 Google AI Adventures 代码:int() 的无效文字,基数为 10:“萼片长度”
- ansible - 关键工具是 Ansible 无法识别位置
- docker - 如何将容器上的端口映射到主机?
- r - 如何将非线性目标函数传递到 R 中的 ROI 包中?
- r - 如何将主题标签及其单词保留为单个标记
- spring - Spring security oauth2 ,从 SecurityContext 获取 userdetails 对象
- jenkins - 方法 parameterizedTimerTrigger 方法未找到
- ruby-on-rails - 用户的未定义方法“current_sign_in_ip”(NoMethodError)
- asp.net - 无法使用分配的公共 IP 访问部署在 ACS kubernetes 集群中的 Windows 容器?
- c - 在C中使用字符串作为数组中的索引