跨站脚本攻击之tld解决方案!
2015-12-21 16:56
253 查看
有时候我们做了表单的前端验证而对服务器验证松懈了,这时候如果有人禁止了浏览器js并向你的服务器提交了
一段<script>alert(1);</script>,并且这段数据被数据库存储了,而你又没有转义特殊标签。其他用户悲剧了,在
访问带这个标签的页面的时候,都不可避免的在当前页无限弹出该alert。这只是最简单的攻击,如果你的服务器
防范有更严重的缺陷,那你就更悲剧了。
这时候,我们在想,是什么时候对这段数据的特殊字符,如<>进行转义输出了,是向数据库里面插入的时候转义还是
从数据库取出的时候转义?我认为,在显示数据的时候转义是最好的办法。
下面给出曾经在项目中,我对xss的防范措施:
在web-inf下定义encode.tld文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<description>
A tag library exercising SimpleTag handlers.
</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/shangyon</uri>
<function>
<name>encodeValue</name>
<function-class>
com.shangyon.ppa.html.function.HtmlFunction
</function-class>
<function-signature>
java.lang.String encodeValue( java.lang.String )
</function-signature>
</function>
</taglib>定义处理类:
public class HtmlFunction {
/**
* 对html中的特殊字符进行转义输出,防止<script>alert(1);</script>等脚本攻击
* tanlei
* @param text
* @return
*/
public static String encodeValue(String text) {
return StringUtil.encode(text);
}
}
StringUtil如下:
public class StringUtil {
public static boolean isEmpty(String str) {
return ("".equals(str) || str == null);
}
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
public static String encode(String text) {
if (text != null) {
text = text.replace("&", "&");
}
if (text == null || "".equals(text)) {
text = "";
}
text = text.replace("&", "&");
text = text.replace(""", """);
text = text.replace("\"", """);
text = text.replace("<", "<");
text = text.replace(">", ">");
text = text.replace("<", "<");
text = text.replace(">", ">");
text = text.replace(">", ">");
return text;
}
}
在jsp页面中进行引用转义输出:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib uri="/WEB-INF/encode.tld" prefix="en"%> <!--引入该函数-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>任务调度</title>
<% String projectUrl = request.getContextPath(); %>
<link type="text/css" rel="stylesheet" href="<%=projectUrl %>/static/css/main.css"/>
</head>
<body>
<div class="search_div">
<table width="100%" align="center" border="0" cellpadding="0" cellspacing="0" class="search_table">
<tr>
<td>
任务名:<input type="text" name="jobName" value="${en:encodeValue(jobName) }" id="jobName"/><!--转义输出-->
<a href="javascript:void(0);" class="myBtn" onclick="searchJob()"><em>查询</em></a>
<a href="javascript:void(0);" class="myBtn" onclick="refresh()"><em>刷新</em></a>
</td>
</tr>
</table>
</div>
这样就轻松解决了特殊标签的转义问题!
一段<script>alert(1);</script>,并且这段数据被数据库存储了,而你又没有转义特殊标签。其他用户悲剧了,在
访问带这个标签的页面的时候,都不可避免的在当前页无限弹出该alert。这只是最简单的攻击,如果你的服务器
防范有更严重的缺陷,那你就更悲剧了。
这时候,我们在想,是什么时候对这段数据的特殊字符,如<>进行转义输出了,是向数据库里面插入的时候转义还是
从数据库取出的时候转义?我认为,在显示数据的时候转义是最好的办法。
下面给出曾经在项目中,我对xss的防范措施:
在web-inf下定义encode.tld文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<description>
A tag library exercising SimpleTag handlers.
</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/shangyon</uri>
<function>
<name>encodeValue</name>
<function-class>
com.shangyon.ppa.html.function.HtmlFunction
</function-class>
<function-signature>
java.lang.String encodeValue( java.lang.String )
</function-signature>
</function>
</taglib>定义处理类:
public class HtmlFunction {
/**
* 对html中的特殊字符进行转义输出,防止<script>alert(1);</script>等脚本攻击
* tanlei
* @param text
* @return
*/
public static String encodeValue(String text) {
return StringUtil.encode(text);
}
}
StringUtil如下:
public class StringUtil {
public static boolean isEmpty(String str) {
return ("".equals(str) || str == null);
}
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
public static String encode(String text) {
if (text != null) {
text = text.replace("&", "&");
}
if (text == null || "".equals(text)) {
text = "";
}
text = text.replace("&", "&");
text = text.replace(""", """);
text = text.replace("\"", """);
text = text.replace("<", "<");
text = text.replace(">", ">");
text = text.replace("<", "<");
text = text.replace(">", ">");
text = text.replace(">", ">");
return text;
}
}
在jsp页面中进行引用转义输出:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib uri="/WEB-INF/encode.tld" prefix="en"%> <!--引入该函数-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>任务调度</title>
<% String projectUrl = request.getContextPath(); %>
<link type="text/css" rel="stylesheet" href="<%=projectUrl %>/static/css/main.css"/>
</head>
<body>
<div class="search_div">
<table width="100%" align="center" border="0" cellpadding="0" cellspacing="0" class="search_table">
<tr>
<td>
任务名:<input type="text" name="jobName" value="${en:encodeValue(jobName) }" id="jobName"/><!--转义输出-->
<a href="javascript:void(0);" class="myBtn" onclick="searchJob()"><em>查询</em></a>
<a href="javascript:void(0);" class="myBtn" onclick="refresh()"><em>刷新</em></a>
</td>
</tr>
</table>
</div>
这样就轻松解决了特殊标签的转义问题!
相关文章推荐
- sql中统计一列中重复的数据个数
- 蓝桥杯 拦截导弹 动态规划(最长下降子序列+最长上升子序列)
- qduoj61 统计人数
- KING_Flash学习之as3.0 常用方法
- 使用MATLAB的fitlm函数进行线性回归
- linux时区的设置
- QRCode.js:使用 JavaScript 生成二维码
- 游戏美术设计干货分享:制造“冲突”,提高画面张力
- injiected group 和 regular group的区别
- h5案例分享 华谊电影《老炮儿》约战
- *.dll丢失解决办法
- POJ 1222 EXTENDED LIGHTS OUT
- Angularjs promise对象解析
- DOTA2 6.86更新日志 史诗级巨变英雄大改
- TMS320C6678基础学习——初步了解TMDXEVM6678L EVM
- 文件下载
- 回族人不吃猪肉真相,原来我们都是文盲(图)
- Mac系统完美配置Cocos2d-x 2.2.3 的Android+IOS双平台环境
- 回调函数
- 求时间段的交集