首页 > 解决方案 > std::regex 对于用户定义的表达式是否安全?

问题描述

使用用户定义的表达式是否安全std::regex(例如用于服务器端搜索)?标准库是否对损坏表达式的安全性做出任何保证?

标签: c++regexsecurity

解决方案


该标准要求当传递的正则表达式无效时,实现会引发错误。

[regex.construct-3]

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()返回fmark_­count()返回表达式中标记的子表达式的数量。

甚至还有一张表格详细说明了可能出现的不同类型的错误。

因此,只要您不传递空指针,从用户提供的字符串创建正则表达式就不应该有未定义的行为

请注意,任何实际实现当然可能仍然存在可能导致安全漏洞的错误。该标准显然也不能保证恶意用户无法通过提交一个非常复杂/自引用的正则表达式来拒绝您的系统,该正则表达式会产生太多的匹配,使用太多的内存/CPU 等,所以你必须自己考虑一下。但是如果你只是担心一个无效的正则表达式是否会导致 UB,答案是“不,你很好”。


推荐阅读