防止SQL注入和XSS攻击Filter


nbsp;今天系统使用IBM的安全漏洞扫描工具扫描出一堆漏洞,下面的filter主要是解决防止SQL注入和XSS攻击

一个是Filter负责将请求的request包装一下。

一个是request包装器,负责过滤掉非法的字符。

将这个过滤器配置上以后,世界总算清净多了。。

代码如下:

  1. import java.io.IOException;
  2. import javax.servlet.Filter;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.FilterConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. import javax.servlet.http.HttpServletRequest;
  9. /**
  10. * <code>{@link CharLimitFilter}</code>
  11. *
  12. * 拦截防止sql注入
  13. *
  14. * @author Administrator
  15. */
  16. public class XssFilter implements Filter {
  17. /* (non-Javadoc)
  18. * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
  19. */
  20. public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
  21. ServletException {
  22. XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
  23. (HttpServletRequest) request);
  24. filterChain.doFilter(xssRequest, response);
  25. }
  26. }

包装器:


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

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他