Java 正则表达式漏洞
由于工作原因,一直没有时间把在线上遇到的问题总结一下。还好,今天我来了。
废话少说了。
主要说一下“java 正则表达式中的一个漏洞”,详细问题描述
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6988218
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507
目前使用 1.6 和 1.7 都没有修补该漏洞。
来个白话文吧
案例代码 Test.java
final Pattern pattern = Pattern.compile("(0*)*A");
final String input = "0000000000000000000000000000000000000000000000";
long startTime = System.currentTimeMillis();
Matcher matcher = pattern.matcher(input);
System.out.println(matcher.find());
System.out.println("Regex took:" + (System.currentTimeMillis() - startTime) + "ms");
意思是说匹配器在输入的末尾并没有检测到”A”。现在外侧的限定符后退一次,内存的则前进一次,如此重复,无法得到结果。
因此,匹配器逐步回退,并尝试所有的组合以找出匹配符号。它最终将返回(没有匹配的结果),但是该过程的复杂性是指数型的(输入中添加一个字符加倍了运行时间)
赶紧查看cpu占用率(top)

尼玛呀,这都上99.9了。吓死宝宝了。赶紧看看这货到底是啥?
查看进程信息(ps -ef | grep 17837)(17837为进程id)

这不是我写的那个测试类吗?看来漏洞复现了。赶紧看一下这货暂用CPU的情况
ps mp 17837 -o THREAD,tid,time (注意逗号之间不要加空格)

这家伙已经占用CPU快一个小时了。应该是死循环了。赶紧看看出啥幺蛾子了。
这时我们可以通过jdk提供的工具查看具体的堆栈信息(jstack )
jstack 17837
#4/13日 发现可以使用 kill -3 pid 来查看dump信息。高兴

问题复现了。这就是我们说说的jdk正则的漏洞。
主要表象就是长时间占用CPU,应用表象就是:页面访问白板,无响应。
具体的解决方案,我不赘述网上其他人说的c,Python的解决方法(因为我不会吗。。。。。)
1)优化正则,别写的那个正则别人一看就吓一跳。其实业务没有那么简单
2)使用线程,并且捕获异常,详见 http://stackoverflow.com/questions/910740/cancelling-a-long-running-regex-match
Java 正则表达式漏洞的更多相关文章
- java正则表达式
java正则表达式 1.Java正则表达式的语法与示例: http://baike.xsoftlab.net/view/207.html 2.Java 正则表达式: http://www.runo ...
- Java正则表达式入门——转自RUNOOB.COM
Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java正则表达式和Perl的是最为相似 ...
- Java 正则表达式详解
Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...
- 【转】详解Java正则表达式语法
(转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...
- java正则表达式【大全】
[正则表达式]文本框输入内容控制整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$& ...
- JAVA正则表达式:Pattern类与Matcher类详解(转)
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...
- JAVA正则表达式:Pattern类与Matcher类详解
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...
- Java 正则表达式[转载]
PS:转载自CSDN博客看上去很美 众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学 ...
- Java正则表达式的应用
在很多种情况下,我们都必须对字符串进行匹配,以便判断字符串的格式是否符合要求,对字符串中的内容进行提取.比如,我要从一段话aabdfe中,判断这段话是否有包含ab这个词,那么如果用if-else来判断 ...
随机推荐
- StringReplace用法
来自:http://www.aspww.cn/View/12022801.aspx ---------------------------------------------------------- ...
- Web Service学习之七:CXF拦截器
一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...
- Educational Codeforces Round 15 (A - E)
比赛链接:http://codeforces.com/contest/702 A. Maximum Increase A题求连续最长上升自序列. [暴力题] for一遍,前后比较就行了. #inclu ...
- CodeForces 548A Mike and Fax (回文,水题)
题意:给定一个字符串,问是不是恰好存在 k 个字符串是回文串,并且一样长. 析:没什么好说的,每次截取n/k个,判断是不是回文就好. 代码如下: #include<bits/stdc++.h&g ...
- Table 样式设置
http://www.gzsums.edu.cn/webclass/html/table.html
- 来自JavaScript Garden摘取
1.数字类型不能用作对象,因为javascript解析器会将点号(.)解析成浮点型(as a floating point literal),比如:2.toString();会导致语法从错误,解决方法 ...
- Windows命令大全
From:http://technet.microsoft.com/zh-cn/library/cc731728(v=ws.10).aspx Adprep Append Arp Assoc At At ...
- java泛型的讲解
java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...
- ASP.NET MVC 3 入门级常用设置、技巧和报错
1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.config配置文件中设置的 <add key="ClientValidationEnabled&quo ...
- Codeforces Round #277 (Div. 2) A. Calculating Function 水题
A. Calculating Function Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/4 ...