使用Fileter防止XSS攻擊

什麼是XSS攻擊:
XSS攻擊使用Javascript腳本注入進行攻擊
例如在表單中注入:
fromToXss.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!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">
<title>Insert title here</title>
</head>
<body>
	<form action="XssDemo" method="post">
		<input type="text" name="userName"> <input type="submit">
	</form>
</body>
</html>

XssDemo:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/XssDemo")
public class XssDemo extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String userName = req.getParameter("userName");
		req.setAttribute("userName", userName);
		req.getRequestDispatcher("showUserName.jsp").forward(req, resp);
	}
	

}

showUserName.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!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">
<title>Insert title here</title>

</head>
<body>userName:${userName}

</body>
</html>

使用Fileter過濾器過濾器注入標籤:

import java.io.IOException;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 使用Filter 打印參數
 * 
 * @author Administrator
 *
 */

public class FilterDemo implements Filter {
	public FilterDemo() {
		System.out.println("FilterDemo 構造函數被執行...");
	}

	/**
	 * 銷燬
	 */
	public void destroy() {
		System.out.println("destroy");
	}

	public void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse,
			FilterChain paramFilterChain) throws IOException, ServletException {
		System.out.println("doFilter");
		HttpServletRequest request = (HttpServletRequest) paramServletRequest;
		XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(request);
		// HttpServletResponse response = (HttpServletResponse)
		// paramServletResponse;
		// // 請求地址
		// String requestURI = request.getRequestURI();
		// System.out.println("requestURI:" + requestURI);
		// // 參數
		// Map<String, String[]> parameterMap = request.getParameterMap();
		// for (String key : parameterMap.keySet()) {
		// String[] arr = parameterMap.get(key);
		// System.out.print("key:");
		// for (String string : arr) {
		// System.out.println(string);
		// }
		// }
		paramFilterChain.doFilter(xssRequestWrapper, paramServletResponse);

	}
	/**
	 * 初始化
	 */
	public void init(FilterConfig paramFilterConfig) throws ServletException {
		System.out.println("init");
	}
}

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * 防止XSS攻擊
 */
public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {
	HttpServletRequest request;
	public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		this.request = request;
	}
	@Override
	public String getParameter(String name) {
		String value = request.getParameter(name);
		System.out.println("name:" + name + "," + value);
		if (!StringUtils.isEmpty(value)) {
			// 轉換Html
			value = StringEscapeUtils.escapeHtml4(value);
		}
		return value;
	}
}
發佈了88 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章