小言_互联网的博客

Java Web使用过滤器防止Xss攻击,解决Xss漏洞 防止解决XSS注入攻击的过滤器filter XssHttpServletRequestWrapper

492人阅读  评论(0)

前段时间,博主在帮忙朋友给一个国营单位做的一个项目中,在上线的前期,客户要求检测漏洞,因此找到了专业的测评公司,测出来好多漏洞,其中就有xss攻击,我讲自己处理的方式分享给大家,便于大家少走弯路。


  
  1. package com.yl.filter;
  2. import java.io.BufferedReader;
  3. import java.io.ByteArrayInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.nio.charset.Charset;
  7. import javax.servlet.ServletInputStream;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletRequestWrapper;
  10. import org.springframework.beans.factory.parsing.ReaderEventListener;
  11. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  12. boolean isUpData = false; //判断是否是上传 上传忽略
  13. public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
  14. super(servletRequest);
  15. String contentType = servletRequest.getContentType ();
  16. if ( null != contentType)
  17. isUpData =contentType.startsWith ( "multipart");
  18. }
  19. @Override
  20. public String[] getParameterValues( String parameter) {
  21. String[] values = super.getParameterValues(parameter);
  22. if (values== null) {
  23. return null;
  24. }
  25. int count = values.length;
  26. String[] encodedValues = new String[count];
  27. for (int i = 0; i < count; i++) {
  28. encodedValues[i] = cleanXSS(values[i]);
  29. }
  30. return encodedValues;
  31. }
  32. @Override
  33. public String getParameter( String parameter) {
  34. String value = super.getParameter(parameter);
  35. if (value == null) {
  36. return null;
  37. }
  38. return cleanXSS(value);
  39. }
  40. /**
  41. * 获取request的属性时,做xss过滤
  42. */
  43. @Override
  44. public Object getAttribute( String name) {
  45. Object value = super.getAttribute(name);
  46. if ( null != value && value instanceof String) {
  47. value = cleanXSS(( String) value);
  48. }
  49. return value;
  50. }
  51. @Override
  52. public String getHeader( String name) {
  53. String value = super.getHeader(name);
  54. if (value == null)
  55. return null;
  56. return cleanXSS(value);
  57. }
  58. private static String cleanXSS( String value) {
  59. value = value.replaceAll( "<", "&lt;").replaceAll( ">", "&gt;");
  60. value = value.replaceAll( "%3C", "&lt;").replaceAll( "%3E", "&gt;");
  61. value = value.replaceAll( "\\(", "&#40;").replaceAll( "\\)", "&#41;");
  62. value = value.replaceAll( "%28", "&#40;").replaceAll( "%29", "&#41;");
  63. value = value.replaceAll( "'", "&#39;");
  64. value = value.replaceAll( "eval\\((.*)\\)", "");
  65. value = value.replaceAll( "[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
  66. value = value.replaceAll( "script", "");
  67. return value;
  68. }
  69. @Override
  70. public ServletInputStream getInputStream () throws IOException {
  71. if (isUpData){
  72. return super.getInputStream ();
  73. } else{
  74. final ByteArrayInputStream bais = new ByteArrayInputStream(inputHandlers( super.getInputStream ()).getBytes ());
  75. return new ServletInputStream() {
  76. @Override
  77. public int read() throws IOException {
  78. return bais.read();
  79. }
  80. public boolean isFinished() {
  81. return false;
  82. }
  83. public boolean isReady() {
  84. return false;
  85. }
  86. public void setReadListener(ReaderEventListener readListener) { }
  87. };
  88. }
  89. }
  90. public String inputHandlers(ServletInputStream servletInputStream){
  91. StringBuilder sb = new StringBuilder();
  92. BufferedReader reader = null;
  93. try {
  94. reader = new BufferedReader( new InputStreamReader (servletInputStream, Charset.forName( "UTF-8")));
  95. String line = "";
  96. while ((line = reader.readLine()) != null) {
  97. sb.append(line);
  98. }
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. } finally {
  102. if (servletInputStream != null) {
  103. try {
  104. servletInputStream.close();
  105. } catch (IOException e) {
  106. e.printStackTrace();
  107. }
  108. }
  109. if (reader != null) {
  110. try {
  111. reader.close();
  112. } catch (IOException e) {
  113. e.printStackTrace();
  114. }
  115. }
  116. }
  117. return cleanXSS(sb.toString ());
  118. }
  119. }

 注意: 标注有上传的地方一定要注意,不能省略掉,否则上传就会有问题,我们当初处理xss攻击时候,忘记管上传了,结果后期在上线阶段上传文件不起作用。

总结:

主要是使用Java Web的过滤器,将所有的request请求参数修改(主要是把存在xss风险的标签转义,如:<script></script>),在转义时我没有自己实现替换与转义,是直接使用的spring自带的HtmlUtils类的htmlEscape方法转义的,方便很多

 

 

 

本人录制了一下智慧消防物联网方面的课程,希望对大家有帮助,需要的可以点击。

立即点击学习 :智慧消防解决方案 


转载:https://blog.csdn.net/u010460625/article/details/109007910
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场