【发布时间】:2018-10-29 15:31:45
【问题描述】:
我尝试使用 jshell 重新创建 regular expression denial of service attack 使用 (a+)+ 正则表达式和 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!(带有大量 a)输入:
Pattern.compile("(a+)+")
.matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!")
.matches()
但是每次我尝试时都会很快完成。 Java中的正则表达式实现与其他实现不同吗?或者链接的维基百科页面有误?
(顺便说一句。我使用的是 Java 11,如果相关的话)
编辑:看起来它与 Java 版本相关,当我在 Java 8 上尝试它时,它挂起,但在 Java 9 和 11 中它可以立即工作。这些版本之间有什么变化可能会影响到这一点?现在所有的正则表达式在 Java 中都是安全的吗?
是否有特定的 Java JEP 改变了正则表达式的实现?我想知道哪种正则表达式对于较新的 Java 来说仍然是个问题。
【问题讨论】:
-
@PM77-1 我尝试了该页面中的代码,它也运行得很快,并按照那里的描述打印结果。
-
您的模式适用于大多数正则表达式引擎。这种模式的唯一问题是当它被其他一些模式遵循时。
-
@WiktorStribiżew 不是真的。 Java 的引擎可能会变得更好一些,但只需将其更改为
((a+)+)+就会使其再次挂起。并且可以证明,每个额外的嵌套,即(((a+)+)+)+,((((a+)+)+)+)+都会增加复杂度,因此 Java 的引擎还没有学会处理这种模式,它只是在嵌套迭代方面变得更好了一点。 -
@Holger 试试
(a)(\1*)+x。我怀疑许多引擎是否具有防止反向引用重复模式的保护。虽然这不是一种常见的模式。
标签: java regex security java-11