package cn.com.venustech.venus4a.servlet;

import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class XSSHttpServletRequestWrapper extends HttpServletRequestWrapper {

	HttpServletRequest orgRequest = null;

	/**
	 * @param request
	 */
	public XSSHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		orgRequest = request;
	}

	/**
	 * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
	 * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
	 */
	public String getParameter(String name) {
		String value = super.getParameter(sanitize(name));
		if (value != null) {
			value = sanitize(value);
		}
		return value;
	}
	
	public String[] getParameterValues(String parameter) {

		String[] values = super.getParameterValues(parameter);
		if (values == null) {
			return null;
		}
		int count = values.length;
		String[] encodedValues = new String[count];
		for (int i = 0; i < count; i++) {
			encodedValues[i] = sanitize(values[i]);
		}
		return encodedValues;
	}
	public Map getParameterMap() {
		Map map = super.getParameterMap();
		Iterator iter = (map.keySet() != null) ? map.keySet().iterator() : null;
		String key = null;
		String[] values = null;
		if (iter != null) {
			while (iter.hasNext()) {
				key = (String) iter.next();
				if (key != null) {
					values = (String[]) map.get(key);
					for (int i = 0; i < values.length; i++)
						values[i] = sanitize(values[i]);
				}
			}
		}

		return map;
	}

	/**
	 * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
	 * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
	 * getHeaderNames 也可能需要覆盖
	 */
	public String getHeader(String name) {
		String value = super.getHeader(sanitize(name));
		if (value != null) {
			value = sanitize(value);
		}
		return value;
	}
	/**
	 * 利用 HtmlSanitizer.sanitize(s);函数处理xss问题 
	 * 
	 * @param s
	 * @return
	 */
	private static String sanitize(String s) {
		return HtmlSanitizer.sanitize(s);
	}
	/**
	 * 将容易引起xss漏洞的半角字符直接替换成全角字符
	 * 
	 * @param s
	 * @return
	 */
	private static String xssEncode(String s) {
		if (s == null || "".equals(s.trim())) {
			return s;
		}
		StringBuilder sb = new StringBuilder(s.length() + 16);
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			switch (c) {
			case '>':
				sb.append('>');// 全角大于号
				break;
			case '<':
				sb.append('<');// 全角小于号
				break;
			case '\'':
				sb.append('‘');// 全角单引号
				break;
			case '\"':
				sb.append('“');// 全角双引号
				break;
			case '&':
				sb.append('&');// 全角
				break;
			case '\\':
				sb.append('\');// 全角斜线
				break;
			case '#':
				sb.append('#');// 全角井号
				break;
			default:
				sb.append(c);
				break;
			}
		}
		return sb.toString();
	}

	/**
	 * 获取最原始的request
	 * 
	 * @return
	 */
	public HttpServletRequest getOrgRequest() {
		return orgRequest;
	}

	/**
	 * 获取最原始的request的静态方法
	 * 
	 * @return
	 */
	public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
		if (req instanceof XSSHttpServletRequestWrapper) {
			return ((XSSHttpServletRequestWrapper) req).getOrgRequest();
		}

		return req;
	}

}
最近下载更多
word33 LV12019年11月6日
星星
yanggongyi LV12019年10月10日
星星
zxgwxit LV12018年4月11日
星星
gao8970206 LV22018年3月23日
星星星星
zyl LV342018年3月13日
太阳太阳星星星星
最代码丶helloworld LV122018年1月28日
月亮月亮月亮
Dyc2017 LV12017年8月8日
星星
myjsoup LV102017年2月13日
月亮月亮星星星星
yl5410521 LV72016年5月10日
月亮星星星星星星
最近浏览更多
s451124894 LV29月25日
星星星星
sayalala LV19月10日
星星
qaqa438 LV15月8日
星星
alexgyp LV52019年12月16日
月亮星星
xingwen00112019年11月29日
暂无贡献等级
bazhenghui2019年11月15日
暂无贡献等级
word33 LV12019年11月6日
星星
ftc1314 LV122019年10月22日
月亮月亮月亮
yanggongyi LV12019年10月10日
星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友