Spring防止Xss配置

<a name='web.xml配置'></a> web.xml配置javascript

&lt;!-- xss過濾器 --&gt;
	&lt;filter&gt;
		&lt;filter-name&gt;XssFilter&lt;/filter-name&gt;
		&lt;filter-class&gt;com.zyyt.sipctask.common.filter.XssFilter&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;XssFilter&lt;/filter-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;

<a name='XssFilter.java'></a> XssFilter.javajava

package com.zyyt.sipctask.common.filter;
import java.io.IOException;

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.http.HttpServletRequest;

public class XssFilter implements Filter {  
  
    FilterConfig filterConfig = null;  
  
    public void init(FilterConfig filterConfig) throws ServletException {  
        this.filterConfig = filterConfig;  
    }  
  
    public void destroy() {  
        this.filterConfig = null;  
    }  
  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new XssHttpServletRequestWrapperNew(  
                    (HttpServletRequest) request), response);  
    }  
}

<a name='XssHttpServletRequestWrapperNew.java'></a> XssHttpServletRequestWrapperNew.javaweb

package com.zyyt.sipctask.common.filter;

import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.regex.Pattern;

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

public class XssHttpServletRequestWrapperNew extends HttpServletRequestWrapper {
	HttpServletRequest orgRequest = null;

	public XssHttpServletRequestWrapperNew(HttpServletRequest request) {
		super(request);
		orgRequest = request;
	}

	/**
	 * 覆蓋getParameter方法,將參數名和參數值都作xss過濾。
	 * 若是須要得到原始的值,則經過super.getParameterValues(name)來獲取
	 * getParameterNames,getParameterValues和getParameterMap也可能須要覆蓋
	 */
	@Override
	public String getParameter(String name) {
		String value = super.getParameter(xssEncode(name));
		if (value != null) {
			value = xssEncode(value);
			value = HTMLEncode(value);
		}
		return value;
	}

	/**
	 * spring是使用的getParameterValues方法
	 */
	@Override
	public String[] getParameterValues(String name) {
		String[] value = super.getParameterValues(name);
		if (value == null) {
			return null;
		}
		for (int i = 0;i &lt; value.length;i++) {
			value[i] = xssEncode(value[i]);
			value[i] = HTMLEncode(value[i]);
		}
		return value;
	}

	/**
	 * 對一些特殊字符進行轉義
	 * 
	 * 
	 */
	public static String HTMLEncode(String aText) {
		final StringBuilder result = new StringBuilder();
		final StringCharacterIterator iterator = new StringCharacterIterator(aText);
		char character = iterator.current();
		while (character != CharacterIterator.DONE) {
			if (character == '&lt;') {
				result.append("<");
			} else if (character == '&gt;') {
				result.append(">");
			} else if (character == '\"') {
				result.append("`");
			} else {
				// the char is not a special one
				// add it to the result as is
				result.append(character);
			}
			character = iterator.next();
		}
		return result.toString();
	}

	/**
	 * 覆蓋getHeader方法,將參數名和參數值都作xss過濾。 若是須要得到原始的值,則經過super.getHeaders(name)來獲取
	 * getHeaderNames 也可能須要覆蓋
	 */
	@Override
	public String getHeader(String name) {

		String value = super.getHeader(xssEncode(name));
		if (value != null) {
			value = xssEncode(value);
		}
		return value;
	}

	/**
	 * 將容易引發xss漏洞的半角字符直接替換成全角字符
	 * 目前xssProject對注入代碼要求是必須開始標籤和結束標籤(如&lt;script&gt;&lt;/script&gt;)正確匹配才能解析,不然報錯;所以只能替換調xssProject換爲自定義實現
	 * 
	 * @param s
	 * @return
	 */
	private static String xssEncode(String s) {
		//
		// if (s == null || s.isEmpty()) {
		// return s;
		// }
		//
		// StringReader reader = new StringReader(s);
		// StringWriter writer = new StringWriter();
		// try {
		// HTMLParser.process(reader, writer, new XSSFilter(), true);
		//
		// String result = writer.toString();
		//
		// System.out.println("xssEncode-------------------------" + s + " = "
		// + result);
		//
		// return result;
		// } catch (NullPointerException e) {
		// return s;
		// } catch (Exception ex) {
		// ex.printStackTrace();
		// }
		//
		// return null;
		if (s == null || s.isEmpty()) {
			return s;
		}

		String result = stripXSS(s);
		if (null != result) {
			result = escape(result);
		}

		return result;

	}

	public static String escape(String s) {
		StringBuilder sb = new StringBuilder(s.length() + 16);
		for (int i = 0; i &lt; s.length(); i++) {
			char c = s.charAt(i);
			switch (c) {
			case '&gt;':
				sb.append('>');// 全角大於號
				break;
			case '&lt;':
				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();
	}

	private static String stripXSS(String value) {
		if (value != null) {
			// NOTE: It's highly recommended to use the ESAPI library and
			// uncomment the following line to
			// avoid encoded attacks.
			// value = ESAPI.encoder().canonicalize(value);
			// Avoid null characters
			value = value.replaceAll("", "");
			// Avoid anything between script tags
			Pattern scriptPattern = Pattern.compile("&lt;script&gt;(.*?)&lt;/script&gt;", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
			// Avoid anything in a src='...' type of expression
			scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
			scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
			// Remove any lonesome &lt;/script&gt; tag
			scriptPattern = Pattern.compile("&lt;/script&gt;", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
			// Remove any lonesome &lt;script ...&gt; tag
			scriptPattern = Pattern.compile("&lt;script(.*?)&gt;",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
			// Avoid eval(...) expressions
			scriptPattern = Pattern.compile("eval\\((.*?)\\)",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
			// Avoid expression(...) expressions
			scriptPattern = Pattern.compile("expression\\((.*?)\\)",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
			// Avoid javascript:... expressions
			scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
			value = scriptPattern.matcher(value).replaceAll("");
			// Avoid onload= expressions
			scriptPattern = Pattern.compile("onload(.*?)=",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");

			scriptPattern = Pattern.compile("&lt;iframe&gt;(.*?)&lt;/iframe&gt;", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");

			scriptPattern = Pattern.compile("&lt;/iframe&gt;", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
			// Remove any lonesome &lt;script ...&gt; tag
			scriptPattern = Pattern.compile("&lt;iframe(.*?)&gt;",
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
		}
		return value;
	}

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

	/**
	 * 獲取最原始的request的靜態方法
	 * 
	 * @return
	 */
	public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
		if (req instanceof XssHttpServletRequestWrapperNew) {
			return ((XssHttpServletRequestWrapperNew) req).getOrgRequest();
		}

		return req;
	}

}
相關文章
相關標籤/搜索