java - Java ReDos 易受攻击吗?

标签 java regex security java-11

我试图重新创建 regular expression denial of service attack using (a+)+ regexp and aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! (with large amounts of a) input using jshell:

Pattern.compile("(a+)+")
    .matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!")
    .matches()

但每次我尝试时都很快完成。 Java 中的正则表达式实现与其他实现不同吗?或者链接的维基百科页面有误?

(顺便说一句。如果相关的话,我正在使用 Java 11)

编辑:看起来它与 Java 版本相关,当我在 Java 8 上尝试时,它挂起,但在 Java 9 和 11 中它可以立即运行。那些可能影响它的版本之间发生了什么变化?现在所有正则表达式在 Java 中都是安全的吗?

是否有特定的 Java JEP 更改了正则表达式的实现?我想知道哪种正则表达式对于较新的 Java 仍然是个问题。

最佳答案

根据文章RSPEC-2631 , ReDoS 问题已经在 J​​ava 9 及之后的版本中得到处理:

Java runtimes like OpenJDK 9+ are mitigating this problem by having additional protections in their implementation of regular expression evaluation. In those runtime the example above is not vulnerable.

关于java - Java ReDos 易受攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53048859/

相关文章:

java - 试图了解 ConcurrentHashMap 的范围

C# 正则表达式仅在标签外部替换字符串

php - 启动进程,从 ps 隐藏参数

java - Xpath 在移动到其他元素时添加 'custom string'

java - 当计算的字符串包含重音字符时,校验和不匹配

java - Android程序崩溃

git - 为什么要签署 Git 标签?

python - 在左右范围内搜索短语

c# - 使用 Regex .net 替换指定的字符

django - 为什么 safari 在用户输入密码时说我的网站不安全 - Django