一、防sql注入办法
在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是为了防止sql注入,xss注入攻击的功能。总共提供了以下几个方法:
1.escapeSql 提供sql转移功能,防止sql注入攻击,例如典型的万能密码攻击' ' or 1=1 ' '
- StringBuffer sql = new StringBuffer("select key_sn,remark,create_date from tb_selogon_key where 1=1 ");
- if(!CommUtil.isEmpty(keyWord)){
- sql.append(" and like '%" + StringEscapeUtils.escapeSql(keyWord) + "%'");
- }
2.escapeHtml /unescapeHtml 转义/反转义html脚本
- System.out.println(StringEscapeUtils.escapeHtml("<a>dddd</a>"));
- //输出结果为:<a>dddd</a>
- System.out.println(StringEscapeUtils.unescapeHtml("<a>dddd</a>"));
- //输出为:<a>ddd</a>
- System.out.println(StringEscapeUtils.escapeJavaScript("<script>alert('1111')</script>"));
- //输出为:<script>alert('111')</script>
- System.out.println(StringEscapeUtils.escapeJava("中国"));
- //输出为:用escapeJava方法转义之后的字符串为:/u4E2D/u56FD/u5171/u4EA7/u515A
如第一部分所说,可以使用commons-lang包后台转换实现;
还可以用 HTML 编码任何网站用户输入的数据,如:<%=Html.Encode(feedback.Message)%> 使用 HTML 编码一个字符串的含意是什么呢?使用 HTML 编码字符串时,危险字符如 < 和 > 被替换为 HTML 实体,如 < 和 >。所以,当使用 HTML 编码字符串 <script>alert("Boo!")</script> 时,它将转换为 <script>alert("Attack!")</script>。浏览器在解析编码的字符串时不再执行 JavaScript 脚本。而是显示无害的页面。
实例
- package stringescapeutils;
- import org.apache.commons.lang.StringEscapeUtils;
- public class StringEscapeUtilsTest {
- public static void main(String args[]){
- String sql="1' or '1'='1";
- System.out.println("防SQL注入:"+StringEscapeUtils.escapeSql(sql)); //防SQL注入
- System.out.println("转义HTML,注意汉字:"+StringEscapeUtils.escapeHtml("<font>chen磊 xing</font>")); //转义HTML,注意汉字
- System.out.println("反转义HTML:"+StringEscapeUtils.unescapeHtml("<font>chen磊 xing</font>")); //反转义HTML
- System.out.println("转成Unicode编码:"+StringEscapeUtils.escapeJava("陈磊兴")); //转义成Unicode编码
- System.out.println("转义XML:"+StringEscapeUtils.escapeXml("<name>陈磊兴</name>")); //转义xml
- System.out.println("反转义XML:"+StringEscapeUtils.unescapeXml("<name>陈磊兴</name>")); //转义xml
- }
- }
输入结果:
- 防SQL注入:1'' or ''1''=''1
- 转义HTML,注意汉字:<font>chen磊 xing</font>
- 反转义HTML:<font>chen磊 xing</font>
- 转成Unicode编码:\u9648\u78CA\u5174
- 转义XML:<name>陈磊兴</name>
- 反转义XML:<name>陈磊兴</name>