Filter 防Xss攻擊

1、Xss認識

xss表示XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意攻擊用戶的特殊目的。

2、示例

最近看項目時看到的web.xml有一個filter的配置:
<filter>
<span style="white-space:pre">	</span><filter-name>xssFilter</filter-name>
<span style="white-space:pre">	</span><filter-class>com.extong.filter.XSSFilter</filter-class>
</filter>
<filter-mapping>
<span style="white-space:pre">	</span><filter-name>xssFilter</filter-name>
<span style="white-space:pre">	</span><url-pattern>/*</url-pattern>
</filter-mapping>

對應的com.extong.filter.XSSFilter類:
public class XSSFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
			ServletException {
		XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
		chain.doFilter(xssRequest, response);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}

網上查了些資料,總結如下:

通過doFilter方法可知該Filter的作用是防止XSS攻擊,通過將request強轉成XssHttpServletRequestWrapper,該類爲request的一個包裝器,將頁面中的非法html片段中的字符進行全角轉換,以達到其失效的目的。
包裝器源碼:
/** 
	 * <code>{@link XssHttpServletRequestWrapper}</code> 
	 * 
	 * TODO : document me 
	 * 
	 * @author Administrator 
	 */  
	public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {  
	    HttpServletRequest orgRequest = null;  
	  
	    public XssHttpServletRequestWrapper(HttpServletRequest request) {  
	        super(request);  
	        orgRequest = request;  
	    }  
	  
	    /** 
	    * 覆蓋getParameter方法,將參數名和參數值都做xss過濾。<br/> 
	    * 如果需要獲得原始的值,則通過super.getParameterValues(name)來獲取<br/> 
	    * getParameterNames,getParameterValues和getParameterMap也可能需要覆蓋 
	    */  
	    @Override  
	    public String getParameter(String name) {  
	        String value = super.getParameter(xssEncode(name));  
	        if (value != null) {  
	            value = xssEncode(value);  
	        }  
	        return value;  
	    }  
	  
	    /** 
	    * 覆蓋getHeader方法,將參數名和參數值都做xss過濾。<br/> 
	    * 如果需要獲得原始的值,則通過super.getHeaders(name)來獲取<br/> 
	    * getHeaderNames 也可能需要覆蓋 
	    */  
	    @Override  
	    public String getHeader(String name) {  
	  
	        String value = super.getHeader(xssEncode(name));  
	        if (value != null) {  
	            value = xssEncode(value);  
	        }  
	        return value;  
	    }  
	  
	    /** 
	    * 將容易引起xss漏洞的半角字符直接替換成全角字符 
	    * 
	    * @param s 
	    * @return 
	    */  
	    private static String xssEncode(String s) {  
	        if (s == null || "".equals(s)) {  
	            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;  
	    }  
	  
	} 


有關XSS攻擊演示可見:http://blog.csdn.net/smstong/article/details/43561607



發佈了17 篇原創文章 · 獲贊 10 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章