实施正则表达式评估程序及相关方法时存在漏洞,该漏洞会导致评估线程在处理嵌套和重复的正则表达式组的重复和交替重叠时挂起。这个缺陷可被攻击者用于执行 DOS (Denial of Service) 攻击。
仔细研究了一把,完全搞懂这种攻击是怎么回事了。直接上代码,看的很清楚
public class RegularExpressionsDOSExp { public static void main(String[] args) { String patterStr = "^(([a-z])+.)+[A-Z]([a-z])+$"; String paraStr = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; long startTime = System.currentTimeMillis(); final Pattern pattern = Pattern.compile(patterStr); final Matcher matcher = pattern.matcher(paraStr); matcher.find(); System.out.println(paraStr.length()); System.out.println("This takes " + (System.currentTimeMillis() - startTime)); } }
实测数据如下:
35个a,耗时950毫秒
40个a,耗时11242毫秒
貌似也没什么好的解决办法,只能通过入参和正则表达式的校验处理防御这种攻击。