JSP使用过滤器防止Xss漏洞
在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符。而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题。而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理。针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少量用户体验,来避免Xss漏洞和SQL注入。
那就是利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符。使得在业务层的处理时不用担心会有异常输入内容。
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(){ } }
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 /*
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。