系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 网络编程 > JSP编程 > 详细页面

JSP使用过滤器防止Xss漏洞

时间:2020-02-03来源:系统城作者:电脑系统城

在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符。而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题。而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理。针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少量用户体验,来避免Xss漏洞和SQL注入。

那就是利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符。使得在业务层的处理时不用担心会有异常输入内容。

XssFilter.java


 
  1. package filter;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11. import javax.servlet.http.HttpServletRequest;
  12.  
  13. public class XssFilter implements Filter {
  14.  
  15. public void init(FilterConfig config) throws ServletException {
  16. }
  17.  
  18. public void doFilter(ServletRequest request, ServletResponse response,
  19. FilterChain chain) throws IOException, ServletException
  20. {
  21. XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
  22. (HttpServletRequest) request);
  23. chain.doFilter(xssRequest, response);
  24. }
  25.  
  26. public void destroy() {
  27. }
  28. }

XssHttpServletRequestWrapper.java


 
  1. package filter;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletRequestWrapper;
  4.  
  5. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  6. HttpServletRequest orgRequest = null;
  7.  
  8. public XssHttpServletRequestWrapper(HttpServletRequest request) {
  9. super(request);
  10. orgRequest = request;
  11. }
  12.  
  13. /**
  14. * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
  15. * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
  16. * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
  17. */
  18. @Override
  19. public String getParameter(String name) {
  20. String value = super.getParameter(xssEncode(name));
  21. if (value != null) {
  22. value = xssEncode(value);
  23. }
  24. return value;
  25. }
  26.  
  27. /**
  28. * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
  29. * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
  30. * getHeaderNames 也可能需要覆盖
  31. */
  32. @Override
  33. public String getHeader(String name) {
  34.  
  35. String value = super.getHeader(xssEncode(name));
  36. if (value != null) {
  37. value = xssEncode(value);
  38. }
  39. return value;
  40. }
  41.  
  42. /**
  43. * 将容易引起xss漏洞的半角字符直接替换成全角字符
  44. *
  45. * @param s
  46. * @return
  47. */
  48. private static String xssEncode(String s) {
  49. if (s == null || s.isEmpty()) {
  50. return s;
  51. }
  52. StringBuilder sb = new StringBuilder(s.length() + 16);
  53. for (int i = 0; i < s.length(); i++) {
  54. char c = s.charAt(i);
  55. switch (c) {
  56. case '>':
  57. sb.append('>');//全角大于号
  58. break;
  59. case '<':
  60. sb.append('<');//全角小于号
  61. break;
  62. case '\'':
  63. sb.append('‘');//全角单引号
  64. break;
  65. case '\"':
  66. sb.append('“');//全角双引号
  67. break;
  68. case '&':
  69. sb.append('&');//全角
  70. break;
  71. case '\\':
  72. sb.append('\');//全角斜线
  73. break;
  74. case '#':
  75. sb.append('#');//全角井号
  76. break;
  77. default:
  78. sb.append(c);
  79. break;
  80. }
  81. }
  82. return sb.toString();
  83. }
  84.  
  85. /**
  86. * 获取最原始的request
  87. *
  88. * @return
  89. */
  90. public HttpServletRequest getOrgRequest() {
  91. return orgRequest;
  92. }
  93. /**
  94. * 获取最原始的request的静态方法
  95. *
  96. * @return
  97. */
  98. public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
  99. if(req instanceof XssHttpServletRequestWrapper){
  100. return ((XssHttpServletRequestWrapper)req).getOrgRequest();
  101. }
  102.  
  103. return req;
  104. }
  105. }

在web.xml中添加


 
  1. <filter>
  2. <filter-name>xssFilter</filter-name>
  3. <filter-class>filter.XssFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>xssFilter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

分享到:

相关信息

  • JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下...

    2020-02-03

  • JSP实现分页效果

    这篇文章主要为大家详细介绍了JSP实现分页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    2020-02-03

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载