Java ReDos是否容易受到攻击?
我试图使用正则表达式重新创建正则表达式拒绝服务攻击,并使用jshell(具有大量)输入:(a+)+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
a
Pattern.compile("(a+)+")
.matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!")
.matches()
但是每次我尝试时,这都会很快完成。Java 中的正则表达式实现是否与其他实现不同?还是链接的维基百科页面是错误的?
(顺便说一句。我正在使用Java 11,如果这相关的话)
编辑:看起来它与Java版本有关,当我在Java 8上尝试它时,它挂起了,但在Java 9和11中,它立即工作。这些版本之间有什么变化可能会影响这一点?现在在Java中所有正则表达式都是安全的吗?
是否有特定的 Java JEP 更改了正则表达式实现?我想知道什么样的正则表达式对于较新的Java来说仍然是一个问题。