实施正则表达式评估程序及相关方法时存在漏洞,该漏洞会导致评估线程在处理嵌套和重复的正则表达式组的重复和交替重叠时挂起。这个缺陷可被攻击者用于执行 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毫秒
貌似也没什么好的解决办法,只能通过入参和正则表达式的校验处理防御这种攻击。
另外想到一个方法就是起一个线程来跑正则,如果超时(比如2秒),就认为是受到攻击不是正常逻辑代码,然后终止线程。
原文地址:https://www.jb51.cc/regex/360024.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。