繁体   English   中英

在 Java 中将“Pattern.LITERAL”标志作为 Pattern.compile(String regex, int flags) 方法的一部分是否可以减轻 String regex 注入?

[英]Does including “Pattern.LITERAL” flag as part of the Pattern.compile(String regex, int flags) method in Java mitigate String regex injection?

在下面的代码库中,我提供 Pattern.LITERAL 作为 Pattern.compile(String regex, int flags) 方法的标志之一,并希望告知此标志是否可以减轻正则表达式注入( https://owasp.org/www -community/attacks/Regular_expression_Denial_of_Service__-_ReDoS ) 在 Java 中与否? 下面是我提供的一个示例模式作为示例。 检查此正则表达式的字符串是用户提供的输入。

private final int flags = Pattern.CASE_INSENSITIVE | 模式.文字;

   Pattern patternCheck = Pattern.compile("check\\s+test\\s+([\\w\\s-]+)cd(\\s+" + variable1 +
    "|\\s+abc\\s+" + variable2 + ")\\s+to\\s+(abc|xyz)\\s+test\\s+ab\\s+xyz",flags);

检查Pattern.LITERAL文档

指定此标志后,指定模式的输入字符串将被视为文字字符序列。 输入序列中的元字符或转义序列将没有特殊含义。

所以,这个标志使任何模式成为纯文本。 \\s将匹配\\s文本,而不是任何空格。

您需要确保的是:

  • 尝试编写每个后续部分不能与前面部分匹配相同文本的模式,以避免过度回溯
  • 使用Pattern.quote转义模式的用户编写的文字部分。

在您的情况下,您可以使用

Pattern patternCheck = Pattern.compile("check\\s+test\\s+([\\w\\s-]+)cd(\\s+" + Pattern.quote(variable1) + "|\\s+abc\\s+" + Pattern.quote(variable2) + ")\\s+to\\s+(abc|xyz)\\s+test\\s+ab\\s+xyz", Pattern.CASE_INSENSITIVE);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM