我试图重新创建 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 问题已经在 Java 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/