欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JSP過濾器防止Xss漏洞的實現(xiàn)方法(分享)

 更新時間:2017年04月25日 09:27:13   投稿:jingxian  
下面小編就為大家?guī)硪黄狫SP過濾器防止Xss漏洞的實現(xiàn)方法(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在用java進(jìn)行web業(yè)務(wù)開發(fā)的時候,對于頁面上接收到的參數(shù),除了極少數(shù)是步可預(yù)知的內(nèi)容外,大量的參數(shù)名和參數(shù)值都是不會出現(xiàn)觸發(fā)Xss漏洞的字符。而通常為了避免Xss漏洞,都是開發(fā)人員各自在頁面輸出和數(shù)據(jù)入庫等地方加上各種各樣的encode方法來避免Xss問題。而由于開發(fā)人員的水平不一,加上在編寫代碼的過程中安全意識的差異,可能會粗心漏掉對用戶輸入內(nèi)容進(jìn)行encode處理。針對這種大量參數(shù)是不可能出現(xiàn)引起Xss和SQL注入漏洞的業(yè)務(wù)場景下,因此可以使用一個適用大多數(shù)業(yè)務(wù)場景的通用處理方法,犧牲少量用戶體驗,來避免Xss漏洞和SQL注入。

那就是利用Servlet的過濾器機制,編寫定制的XssFilter,將request請求代理,覆蓋getParameter和getHeader方法將參數(shù)名和參數(shù)值里的指定半角字符,強制替換成全角字符。使得在業(yè)務(wù)層的處理時不用擔(dān)心會有異常輸入內(nèi)容。

Filter負(fù)責(zé)將請求的request包裝一下。

XssFilter.Java

package 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 { 
 
public void init(FilterConfig config) throws ServletException { 
} 
 
public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException  
{ 
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper( 
(HttpServletRequest) request); 
chain.doFilter(xssRequest, response); 
} 
 
public void destroy() { 
} 
} 

request包裝器,負(fù)責(zé)過濾掉非法的字符。

XssHttpServletRequestWrapper.java

package filter; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
 
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { 
HttpServletRequest orgRequest = null; 
 
public XssHttpServletRequestWrapper(HttpServletRequest request) { 
super(request); 
orgRequest = request; 
} 
 
/** 
* 覆蓋getParameter方法,將參數(shù)名和參數(shù)值都做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方法,將參數(shù)名和參數(shù)值都做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 || s.isEmpty()) { 
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的靜態(tài)方法 
* 
* @return 
*/ 
public static HttpServletRequest getOrgRequest(HttpServletRequest req) { 
if(req instanceof XssHttpServletRequestWrapper){ 
return ((XssHttpServletRequestWrapper)req).getOrgRequest(); 
} 
 
return req; 
} 
} 

在web.xml中添加

<filter> 
<filter-name>xssFilter</filter-name> 
<filter-class>filter.XssFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>xssFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

以上這篇JSP過濾器防止Xss漏洞的實現(xiàn)方法(分享)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論