StringEscapeUtils防止xss攻击详解
StringUtils和StringEscapeUtils这两个实用类。

1、转义防止xss攻击
1、转义可以分为下面的几种情况
第一用户输入特殊字符的时候,在提及的时候不做任何处理保持到数据库,当用户从数据库查询对对于的数据的时候,因为数据中存在特殊字符,要让特殊字符能够正常显示不被网页执行,需要对从数据库中查询出来的数据进行转义,比如用户输入一个左尖括号(<),在输出HTML代码对其进行显示的话,应该用”<”来表示
例如在数据库中存储的数据是:
<alert>(123)(*&^%$#@!)</alert>
如果不对这个数据中特殊字符进行转义,浏览器执行的时候会吧上面的语句当做是js引擎可以执行的语句,弹出一个alter对话框,经过转义之后
import org.apache.commons.lang3.StringEscapeUtils;
public class XSStest
{
public static void main(String[] args)
{
String s = "<alert>(123)(*&^%$#@!)</alert>";
s = StringEscapeUtils.escapeHtml4(s);
System.out.println(s);
}
}
输出的结果是:
这样输出是: <alert>(123)(*&^%$#@!)</alert>
可以有效的防止恶意的页面跳转,alert弹框。
commons-lang常用工具类StringEscapeUtils
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>
3.escapeJavascript/unescapeJavascript 转义/反转义js脚本
System.out.println(StringEscapeUtils.escapeJavaScript("<script>alert('1111')</script>"));
输出为:<script>alert('111')</script>
4.escapeJava/unescapeJava 把字符串转为unicode编码
System.out.println(StringEscapeUtils.escapeJava("中国"));
输出为:用escapeJava方法转义之后的字符串为:/u4E2D/u56FD/u5171/u4EA7/u515A
那么,所谓的加密其实就是做了unicode编码而已。
注意点:
表单富文本输入时,有html,需要转义,html+加中文时,用StringEscapeUtils.escapeHtml转义时,中文也转义了,经过查找,最终找到spring的org.springframework.web.util.HtmlUtils.htmlEscape,改转义不会对中午进行转义
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.0.6.RELEASE</version>
</dependency> public static void main(String[] args) {
String a = "<html>吃饭</html>";
System.out.println(StringEscapeUtils.escapeHtml(a));
System.out.println(StringEscapeUtils.unescapeHtml(StringEscapeUtils.escapeHtml(a)));
System.out.println(HtmlUtils.htmlEscape(a));
System.out.println(HtmlUtils.htmlUnescape(HtmlUtils.htmlEscape(a)));
}
执行结果: <html>吃饭</html> <html>吃饭</html> <html>吃饭</html> <html>吃饭</html> 感觉还是spring好,一点一滴的比较贴心。
这里,我们使用代码进行详细测试下
需要引入最新的依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
import java.io.IOException; import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) throws IOException { String str = "thi is <alter>a test 这是一个测试</alter>";
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<persons>\n" +
" <person id=\"23\">\n" +
" <name>张 三</name>\n" +
" <age>26</age>\n" +
" </person>\n" +
" <person id=\"22\">\n" +
" <name>李四</name>\n" +
" <age>25</age>\n" +
" </person>\n" +
"</persons>"; System.out.println("用escapeJava方法转义之后的字符串为:"+ StringEscapeUtils.escapeJava(str)); System.out.println("用unescapeJava方法反转义之后的字符串为:"+StringEscapeUtils.unescapeJava(StringEscapeUtils.escapeJava(str))); System.out.println("用escapeHtml方法转义之后的字符串为:"+StringEscapeUtils.escapeHtml3(str)); System.out.println("用unescapeHtml方法反转义之后的字符串为:"+StringEscapeUtils.unescapeHtml3(StringEscapeUtils.escapeHtml3(str))); System.out.println("用escapeXml方法转义之后的字符串为:"+StringEscapeUtils.escapeXml(xml)); System.out.println("用unescapeXml方法反转义之后的字符串为:"+StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml(xml))); String json2 = "{\"name\":\"chenggang\",\"age\":24}";
System.out.println("用escapeJson方法转义之后的字符串为:"+StringEscapeUtils.escapeJson(json2)); System.out.println("用unescapeJson方法反转义之后的字符串为:"+StringEscapeUtils.unescapeJson(StringEscapeUtils.escapeJson(json2))); } }
程序运行的结果是:
用escapeJava方法转义之后的字符串为:thi is <alter>a test \u8FD9\u662F\u4E00\u4E2A\u6D4B\u8BD5</alter>
用unescapeJava方法反转义之后的字符串为:thi is <alter>a test 这是一个测试</alter>
用escapeHtml方法转义之后的字符串为:thi is <alter>a test 这是一个测试</alter>
用unescapeHtml方法反转义之后的字符串为:thi is <alter>a test 这是一个测试</alter>
用escapeXml方法转义之后的字符串为:<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>张 三</name>
<age>26</age>
</person>
<person id="22">
<name>李四</name>
<age>25</age>
</person>
</persons>
用unescapeXml方法反转义之后的字符串为:<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>张 三</name>
<age>26</age>
</person>
<person id="22">
<name>李四</name>
<age>25</age>
</person>
</persons>
用escapeJson方法转义之后的字符串为:{\"name\":\"chenggang\",\"age\":24}
用unescapeJson方法反转义之后的字符串为:{"name":"chenggang","age":24}

2、转义预防sql注入
在commons-lang3版本上去除了2版本中对于的StringEscapeUtils.escapeSql这个方法,因为这个办法原来的实现采用下面的代码
public static String escapeSql(String str) {
693 if (str == null) {
694 return null;
695 }
696 return StringUtils.replace(str, "'", "''");
官网不推荐采用这种方法预防sql注入,而应该采用预编译的方式来防止sql注入,不要采用拼接的方式
You do not need to escape any elements that you insert using the functions on a prepared statement. Those are escaped automatically.
采用下面预编译的方式来防止sql注入
con.prepareStatement("INSERT INTO table1 VALUES (?,?)");
pstmt.setInt(1, 200);
pstmt.setString(2, "Julie");
pstmt.executeUpdate();
StringEscapeUtils防止xss攻击详解的更多相关文章
- 网络攻击-XSS攻击详解
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...
- Linux网络编程--洪水攻击详解
洪水攻击详解 ①注解:洪水攻击(FLOOD ATTACK)是指利用计算机网络技术向目标主机发送大量无用的数据报文,使得目标主机忙于处理无用的数据报文而无法提供正常服务的网络行为. 主要原理:利用了网络 ...
- XSS(跨站脚本攻击)详解
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web ...
- xss 和 csrf攻击详解
在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同 ...
- 【网络安全】CSRF攻击详解
目录 什么是CSRF攻击 CSRF攻击的流程 常见的CSRF攻击类型 CSRF漏洞测试 预防CSRF攻击 参考 什么是CSRF攻击 CSRF(Cross-Site Request Forgery)的全 ...
- web前端攻击详解
前端攻击成因 在web网页的脚本中,有些部分的显示内容会依据外界输入值而发生变化,而如果这些声称html的程序中存在问题,就会滋生名为跨站脚本的安全隐患 XSS跨站脚本攻击: 英文全称cross-si ...
- 关于CSRF攻击详解
CSRF的原理以及防范 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你 ...
随机推荐
- python的map,reduce函数与pandas的apply,filter函数
1. python自带的apply.filter.map函数.reduce函数,很多情况下可以代替for循环: map(func,list),对list的每个元素分别执行func函数操作,显然func ...
- Linux光盘yum源软件安装
关于Linux中的软件安装,有三种方法,个人认为比较方便的就是yum安装,有网的话比较简单,暂且不提.本文主要记录在没有外网的情况下,如何以本地光盘搭建yum源来实现yum安装. 主要包括以下几步: ...
- Java Spring Cloud 实战之路 - 1 创建项目
0. 前言 该项目使用Maven进行管理和构建,所以需要预先配置好Maven.嗯,在这个系列里就不做过多的介绍了. 1. 创建项目 先创建一个pom.xml 文件,添加以下内容: <?xml v ...
- 面试题: hashset如何保证值不会被重复的
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 众所周知,HashSet 的值是不可能被重复的,在业务上经常被用来做数据去重的操作,那么,其内部究竟是怎 ...
- Java实现 LeetCode 662 二叉树最大宽度(递归)
662. 二叉树最大宽度 给定一个二叉树,编写一个函数来获取这个树的最大宽度.树的宽度是所有层中的最大宽度.这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空. 每一层的 ...
- Java实现k个数乘(cheng)(自然数的k乘积问题)
k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...
- Java实现蓝桥杯模拟带九9的数的个数
问题描述 在1至2019中,有多少个数的数位中包含数字9? 注意,有的数中的数位中包含多个9,这个数只算一次.例如,1999这个数包含数字9,在计算只是算一个数. 答案提交 这是一道结果填空的题,你只 ...
- Java实现 LeetCode 202 快乐数
202. 快乐数 编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过 ...
- java实现迷宫问题
迷宫问题 对于走迷宫,人们提出过很多计算机上的解法.深度优先搜索.广度优先搜索是使用最广的方法.生活中,人们更 愿意使用"紧贴墙壁,靠右行走"的简单规则. 58 下面的代码则采用了 ...
- 本地存储 localStorage
本地存储localStorage 概念:window对象下面的属性,html5新增的,将5M大小的数据存储本地的浏览器上面. 浏览器支持存储5M大小 本地存储localStorage特点 本地存储属于 ...