std::regex 对于用户定义的表达式是否安全?

E C*_*ole 5 c++ regex security

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

Max*_*hof 3

该标准要求实现在传递的正则表达式无效时抛出错误。

\n
\n

[正则表达式.construct-3]

\n
explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);\n
Run Code Online (Sandbox Code Playgroud)\n

要求: p不得为空指针。

\n

抛出: regex_\xc2\xaderror ifp不是有效的正则表达式。

\n

作用:构造一个basic_\xc2\xadregex类的对象;对象的内部有限状态机是根据charT长度数组中包含的正则表达式构造的char_\xc2\xadtraits<charT>::\xe2\x80\x8blength(p),该数组的第一个元素由 指定p,并根据标志 进行解释f

\n

确保: flags()回报fmark_\xc2\xadcount()返回表达式中标记的子表达式的数量。

\n
\n

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

\n

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

\n

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

\n