温馨提示×

JSP如何写过滤器防止xss攻击

小新
340
2021-01-14 13:32:43
栏目: 网络安全

JSP如何写过滤器防止xss攻击

JSP写过滤器防止xss攻击的方法:

利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符,代码如下:

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() {

 }

}

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方法,将参数名和参数值都做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 || 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的静态方法

*

* @return

*/

 public static HttpServletRequest getOrgRequest(HttpServletRequest req) {

 if(req instanceof XssHttpServletRequestWrapper){

 return ((XssHttpServletRequestWrapper)req).getOrgRequest();

}

  

return req;

}

}

</pre>

在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>


0