您的位置:首页 > 其它

跨站脚本攻击之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>

这样就轻松解决了特殊标签的转义问题!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: