经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » JSP » 查看文章
JSP使用过滤器防止Xss漏洞
来源:jb51  时间:2019/4/18 8:25:28  对本文有异议

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

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

XssFilter.java

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

XssHttpServletRequestWrapper.java

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

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号