分類  >  互聯網 >

防護XSS攻擊

tags:    時間:2013-12-27 15:41:55
防範XSS攻擊

如何杜絕跨站腳本

• 輸入輸出過濾元字元

– <>

– ()

– &、#、%、?

• 輸入輸出轉義元字元

– '<' → &lt; '>' → &gt;

– '&' → &amp;

– ' → %#027; " → &quot;

 

方法一、過濾特殊字元

如<script>、<img>、<iframe>……

示例代碼:

  import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.regex.Pattern;  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;  /**  * 防止XSS(Cross Site Script)攻擊的Filter  *   *   */ public class XSSDefendFilter implements Filter {  	public  static List<String> arrTagList = new ArrayList<String>();  	// public static boolean filterSwitch = 	// com.travelsky.caair.common.Para.xssFilterB2C;  	public XSSDefendFilter() {  		super(); 		if (arrTagList.size() == 0) {// 過濾敏感HTML TAG  			arrTagList.add("<script"); 			arrTagList.add("<embed"); 			arrTagList.add("<style"); 			arrTagList.add("<frame"); 			arrTagList.add("<object"); 			arrTagList.add("<iframe"); 			arrTagList.add("<frameset"); 			arrTagList.add("<meta"); 			arrTagList.add("<xml"); 			arrTagList.add("<applet"); 			arrTagList.add("<link"); 			arrTagList.add("onload"); 			arrTagList.add("<img"); 			arrTagList.add("<a"); 			arrTagList.add("onmouse"); 			arrTagList.add("onblur"); 			arrTagList.add("onchange"); 			arrTagList.add("onclick"); 			arrTagList.add("ondblclick"); 			arrTagList.add("onkey"); 			arrTagList.add("onfocus"); 			arrTagList.add("onselect"); 		} 	}  	public void init(FilterConfig cfg) throws ServletException { 		// TODO Auto-generated method stub  	}  	@SuppressWarnings("unchecked") 	public void doFilter(ServletRequest request, ServletResponse response, 			FilterChain chain) throws IOException, ServletException { 		// TODO Auto-generated method stub 		boolean flag = false; 		Enumeration en = request.getParameterNames(); 		String prtName = "-"; 		String prtValue = "-";  		while (en.hasMoreElements()) { 			prtName = (String) en.nextElement(); 			prtValue = request.getParameter(prtName); 			if (prtValue != null) { 				if (judgeTagByRegular(prtValue.toLowerCase())) { 					System.out.println("ERROR Filter:" + prtName + "=" 							+ prtValue); 					flag = true; 					break; 				} 			} 		}  		if (!flag) { 			chain.doFilter(request, response); 		} else {// Error Process,如果有錯誤,大家自己定向到一個位置 			System.out.println("ERROR Filter:" 					+ ((HttpServletRequest) request).getRequestURI());  			((javax.servlet.http.HttpServletResponse) response) 					.sendRedirect(((HttpServletRequest) request).getContextPath()+ "/index.jsp"); 		} 	}  	/** 	 * 對arrTagList 的tag 用正則表達式封裝 	 *  	 * @param obj 	 * @return 	 */ 	private boolean judgeTagByRegular(String obj)  	{  		Pattern pattern = Pattern 				.compile( 						"(.*\\s*)((<\\s*script\\s*)|(<\\s*embed\\s*)|(<\\s*style\\s*)|(<\\s*img\\s*)|(<\\s*image\\s*)|(<\\s*frame\\s*)|(<\\s*object\\s*)|(<\\s*iframe\\s*)|(<\\s*a\\s*)|(<\\s*frameset\\s*)|(<\\s*meta\\s*)|(<\\s*xml\\s*)|(<\\s*applet\\s*)|(\\s*onmouse\\s*)|(<\\s*link\\s*)|(\\s*onload\\s*)|(\\s*onblur\\s*)|(\\s*onchange\\s*)|(\\s*onclick\\s*)|(\\s*ondblclick\\s*)|(\\s*onfocus\\s*)|(\\s*onkey\\s*)|(\\s*onselect\\s*)|(\\s*alert\\s*\\())(.*\\s*)", 						Pattern.CASE_INSENSITIVE);  		return pattern.matcher(obj).matches();  	}  	@SuppressWarnings("unused") 	private boolean judgeHasTag(String obj) { 		for (int i = 0; i < arrTagList.size(); i++) { 			String tt = arrTagList.get(i).toString(); 			if (obj.indexOf(tt) >= 0) { 				return true; 			} 		} 		return false; 	}  	/* 	 * (non-Java-doc) 	 *  	 * @see javax.servlet.Filter#destroy() 	 */ 	public void destroy() { 		// TODO Auto-generated method stub 	}   }

  此方法有一定局限性,有很多可以繞過的方式:

<scRIpt> <scr%00ript> <scr\nript> eval('<scr'+'ipt>') < script > ...

 

方法二:還可以使用HTML和URL編碼來避免問題。

   可以使用apache-lang包中的提供的方法,如下:

System.out.println(StringEscapeUtils.escapeHtml("<iframe src='http://www.baidu.com'/>")); 	 System.out.println(StringEscapeUtils.escapeHtml("<script>alert('ok');</script>"));

    使用以上方法會得到下面的結果:

&lt;iframe src='http://www.baidu.com'/&gt; &lt;script&gt;alert('ok');&lt;/script&gt;

 

    這樣經過html轉義就可以防止html元素代碼執行。方式XSS攻擊。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網