我尝试重新创建正则表达式拒绝服务攻击 https://en.wikipedia.org/wiki/ReDoS using (a+)+
正则表达式和aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
(含有大量的a
)使用jshell输入:
Pattern.compile("(a+)+")
.matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!")
.matches()
但每次我尝试时都很快完成。 Java 中的 regexp 实现与其他的不同吗?或者链接的维基百科页面是错误的?
(顺便说一句。我正在使用 Java 11,如果相关的话)
编辑:看起来它与 Java 版本相关,当我在 Java 8 上尝试时,它挂起,但在 Java 9 和 11 中它可以立即工作。这些版本之间发生了什么变化可能会影响这一点?现在 Java 中的所有正则表达式都安全吗?
是否有特定的 Java JEP 改变了 regexp 实现?我想知道对于较新的 Java 来说,什么样的正则表达式仍然是一个问题。
根据这篇文章RSPEC-2631 https://rules.sonarsource.com/java/RSPEC-2631,ReDoS问题已在Java 9及更高版本中得到处理:
像 OpenJDK 9+ 这样的 Java 运行时通过在正则表达式求值的实现中提供额外的保护来缓解这个问题。在这些运行时,上面的示例不容易受到攻击。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)