实施正则表达式评估程序及相关方法时存在漏洞,该漏洞会导致评估线程在处理嵌套和重复的正则表达式组的重复和交替重叠时挂起。这个缺陷可被攻击者用于执行 DOS (Denial of Service) 攻击。
@H_404_4@ 仔细研究了一把,完全搞懂这种攻击是怎么回事了。直接上代码,看的很清楚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)); } }
实测数据如下:
@H_404_4@ 35个a,耗时950毫秒 @H_404_4@ 40个a,耗时11242毫秒 @H_404_4@ 貌似也没什么好的解决办法,只能通过入参和正则表达式的校验处理防御这种攻击。 @H_404_4@ 另外想到一个方法就是起一个线程来跑正则,如果超时(比如2秒),就认为是受到攻击不是正常逻辑代码,然后终止线程。 原文链接:https://www.f2er.com/regex/360024.html