JSP过滤器防止Xss漏洞的实现方法(分享)
在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符。而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题。而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理。针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少量用户体验,来避免Xss漏洞和SQL注入。
那就是利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符。使得在业务层的处理时不用担心会有异常输入内容。
Filter负责将请求的request包装一下。
XssFilter.Java
packagefilter;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
publicclassXssFilterimplementsFilter{
publicvoidinit(FilterConfigconfig)throwsServletException{
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException
{
XssHttpServletRequestWrapperxssRequest=newXssHttpServletRequestWrapper(
(HttpServletRequest)request);
chain.doFilter(xssRequest,response);
}
publicvoiddestroy(){
}
}
request包装器,负责过滤掉非法的字符。
XssHttpServletRequestWrapper.java
packagefilter;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletRequestWrapper;
publicclassXssHttpServletRequestWrapperextendsHttpServletRequestWrapper{
HttpServletRequestorgRequest=null;
publicXssHttpServletRequestWrapper(HttpServletRequestrequest){
super(request);
orgRequest=request;
}
/**
*覆盖getParameter方法,将参数名和参数值都做xss过滤。
*如果需要获得原始的值,则通过super.getParameterValues(name)来获取
*getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
*/
@Override
publicStringgetParameter(Stringname){
Stringvalue=super.getParameter(xssEncode(name));
if(value!=null){
value=xssEncode(value);
}
returnvalue;
}
/**
*覆盖getHeader方法,将参数名和参数值都做xss过滤。
*如果需要获得原始的值,则通过super.getHeaders(name)来获取
*getHeaderNames也可能需要覆盖
*/
@Override
publicStringgetHeader(Stringname){
Stringvalue=super.getHeader(xssEncode(name));
if(value!=null){
value=xssEncode(value);
}
returnvalue;
}
/**
*将容易引起xss漏洞的半角字符直接替换成全角字符
*
*@params
*@return
*/
privatestaticStringxssEncode(Strings){
if(s==null||s.isEmpty()){
returns;
}
StringBuildersb=newStringBuilder(s.length()+16);
for(inti=0;i':
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;
}
}
returnsb.toString();
}
/**
*获取最原始的request
*
*@return
*/
publicHttpServletRequestgetOrgRequest(){
returnorgRequest;
}
/**
*获取最原始的request的静态方法
*
*@return
*/
publicstaticHttpServletRequestgetOrgRequest(HttpServletRequestreq){
if(reqinstanceofXssHttpServletRequestWrapper){
return((XssHttpServletRequestWrapper)req).getOrgRequest();
}
returnreq;
}
}
在web.xml中添加
xssFilter filter.XssFilter xssFilter /*
以上这篇JSP过滤器防止Xss漏洞的实现方法(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。