当前位置:   article > 正文

Spring Boot 防止XSS攻击_springboot防止xss攻击

springboot防止xss攻击
  • XSS

跨站脚本工具(cross 斯特scripting),为不和层叠样式表(cascading style sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往web页面里插入恶意ScriptScript代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。防止XSS攻击简单的预防就是对Request请求中的一些参数去掉一些比较敏感的脚本命令。原本是打算通过SpringMVC的HandlerInterceptor机制来实现的,通过获取request然后对request中的参数进行修改,结果虽然值修改了,但在Controller中获取的数值还是没有修改的。没办法就是要Filter来完成。简单来说就是创建一个新的HttpRequest类XssHttpServletRequestWrapper,然后重写一些get方法(获取参数时对参数进行XSS判断预防)

流程梳理

包装request->创建过滤器->添加过滤器

  1. 创建包装request的类 XssHttpServletRequestWrapper
  1. import java.io.BufferedReader;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.nio.charset.Charset;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8. import javax.servlet.ReadListener;
  9. import javax.servlet.ServletInputStream;
  10. import javax.servlet.ServletOutputStream;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletRequestWrapper;
  13. import javax.servlet.http.HttpServletResponse;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import com.sysware.framework.exceptions.SyswareRuntimeException;
  17. import com.sysware.framework.file.service.impl.FileGridServiceImpl;
  18. public class XssHttpServletRequestWraper extends HttpServletRequestWrapper {
  19. private Logger log = LoggerFactory.getLogger(FileGridServiceImpl.class);
  20. public XssHttpServletRequestWraper() {
  21. super(null);
  22. }
  23. public XssHttpServletRequestWraper(HttpServletRequest httpservletrequest) {
  24. super(httpservletrequest);
  25. }
  26. //过滤springmvc中的 @RequestParam 注解中的参数
  27. public String[] getParameterValues(String s) {
  28. String str[] = super.getParameterValues(s);
  29. if (str == null) {
  30. return null;
  31. }
  32. int i = str.length;
  33. String as1[] = new String[i];
  34. for (int j = 0; j < i; j++) {
  35. //System.out.println("getParameterValues:"+str[j]);
  36. as1[j] = cleanXSS(cleanSQLInject(str[j]));
  37. }
  38. log.info("XssHttpServletRequestWraper净化后的请求为:==========" + as1);
  39. return as1;
  40. }
  41. //过滤request.getParameter的参数
  42. public String getParameter(String s) {
  43. String s1 = super.getParameter(s);
  44. if (s1 == null) {
  45. return null;
  46. } else {
  47. String s2 = cleanXSS(cleanSQLInject(s1));
  48. log.info("XssHttpServletRequestWraper净化后的请求为:==========" + s2);
  49. return s2;
  50. }
  51. }
  52. //过滤请求体 json 格式的
  53. @Override
  54. public ServletInputStream getInputStream() throws IOException {
  55. final ByteArrayInputStream bais = new ByteArrayInputStream(inputHandlers(super.getInputStream ()).getBytes ());
  56. return new ServletInputStream() {
  57. @Override
  58. public int read() throws IOException {
  59. return bais.read();
  60. }
  61. @Override
  62. public boolean isFinished() {
  63. return false;
  64. }
  65. @Override
  66. public boolean isReady() {
  67. return false;
  68. }
  69. @Override
  70. public void setReadListener(ReadListener readListener) { }
  71. };
  72. }
  73. public String inputHandlers(ServletInputStream servletInputStream){
  74. StringBuilder sb = new StringBuilder();
  75. BufferedReader reader = null;
  76. try {
  77. reader = new BufferedReader(new InputStreamReader(servletInputStream, Charset.forName("UTF-8")));
  78. String line = "";
  79. while ((line = reader.readLine()) != null) {
  80. sb.append(line);
  81. }
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. } finally {
  85. if (servletInputStream != null) {
  86. try {
  87. servletInputStream.close();
  88. } catch (IOException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. if (reader != null) {
  93. try {
  94. reader.close();
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. return cleanXSS(sb.toString ());
  101. }
  102. public String cleanXSS(String src) {
  103. String temp = src;
  104. src = src.replaceAll("<", "<").replaceAll(">", ">");
  105. src = src.replaceAll("\\(", "(").replaceAll("\\)", ")");
  106. src = src.replaceAll("'", "");
  107. src = src.replaceAll(";", "");
  108. /**-----------------------start--------------------------*/
  109. src = src.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
  110. src = src.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41");
  111. src = src.replaceAll("eval\\((.*)\\)", "");
  112. src = src.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
  113. // src = src.replaceAll("script", "");
  114. // src = src.replaceAll("link", "");
  115. // src = src.replaceAll("frame", "");
  116. /**-----------------------end--------------------------*/
  117. Pattern pattern = Pattern.compile("(eval\\((.*)\\)|script)",
  118. Pattern.CASE_INSENSITIVE);
  119. Matcher matcher = pattern.matcher(src);
  120. src = matcher.replaceAll("");
  121. pattern = Pattern.compile("[\\\"\\'][\\s]*javascript:(.*)[\\\"\\']",
  122. Pattern.CASE_INSENSITIVE);
  123. matcher = pattern.matcher(src);
  124. src = matcher.replaceAll("\"\"");
  125. // 增加脚本
  126. src = src.replaceAll("script", "").replaceAll(";", "")
  127. /*.replaceAll("\"", "").replaceAll("@", "")*/
  128. .replaceAll("0x0d", "").replaceAll("0x0a", "");
  129. // if (!temp.equals(src)) {
  130. // // System.out.println("输入信息存在xss攻击!");
  131. // // System.out.println("原始输入信息-->" + temp);
  132. // // System.out.println("处理后信息-->" + src);
  133. //
  134. // log.error("xss攻击检查:参数含有非法攻击字符,已禁止继续访问!!");
  135. // log.error("原始输入信息-->" + temp);
  136. //
  137. // throw new SyswareRuntimeException("xss攻击检查:参数含有非法攻击字符,已禁止继续访问!!");
  138. // }
  139. return src;
  140. }
  141. //输出
  142. public void outputMsgByOutputStream(HttpServletResponse response, String msg) throws IOException {
  143. ServletOutputStream outputStream = response.getOutputStream(); //获取输出流
  144. response.setHeader("content-type", "text/html;charset=UTF-8"); //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
  145. byte[] dataByteArr = msg.getBytes("UTF-8");// 将字符转换成字节数组,指定以UTF-8编码进行转换
  146. outputStream.write(dataByteArr);// 使用OutputStream流向客户端输出字节数组
  147. }
  148. // 需要增加通配,过滤大小写组合
  149. public String cleanSQLInject(String src) {
  150. String lowSrc = src.toLowerCase();
  151. String temp = src;
  152. String lowSrcAfter = lowSrc.replaceAll(" insert ", "forbidI")
  153. .replaceAll(" select ", "forbidS")
  154. .replaceAll(" update ", "forbidU")
  155. .replaceAll(" delete ", "forbidD").replaceAll(" and ", "forbidA")
  156. .replaceAll(" or ", "forbidO").replace("'", "");
  157. if (!lowSrcAfter.equals(lowSrc)) {
  158. log.error("sql注入检查:输入信息存在SQL攻击!");
  159. log.error("原始输入信息-->" + temp);
  160. log.error("处理后信息-->" + lowSrc);
  161. throw new SyswareRuntimeException("sql注入检查:参数含有非法攻击字符,已禁止继续访问!!");
  162. }
  163. return src;
  164. }
  165. }

注意:
getInputStream()方法的流处理,注解方式获取数据貌似是根据这个流取得的数据。
因为super.getInputStream()流只允许读取一次,所以在getInputStream()方法中
处理完流数据后返回了一个新的ServletInputStream。另外替换方法里的替换规则,
也可以根据实际业务需要进行调整。

2.创建过滤器 XssFilter

  1. @Component
  2. public class XssFilter implements Filter {
  3. // 忽略权限检查的url地址
  4. private final String[] excludeUrls = new String[]{
  5. "/api/item","api/document"
  6. };
  7. public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
  8. throws IOException, ServletException {
  9. HttpServletRequest req = (HttpServletRequest) arg0;
  10. HttpServletResponse response = (HttpServletResponse) arg1;
  11. String pathInfo = req.getPathInfo() == null ? "" : req.getPathInfo();
  12. //获取请求url的后两层
  13. String url = req.getServletPath() + pathInfo;
  14. //获取请求你ip后的全部路径
  15. String uri = req.getRequestURI();
  16. //注入xss过滤器实例
  17. XssHttpServletRequestWraper reqW = new XssHttpServletRequestWraper(req);
  18. //过滤掉不需要的Xss校验的地址
  19. for (String str : excludeUrls) {
  20. if (uri.indexOf(str) >= 0) {
  21. //过滤
  22. arg2.doFilter(reqW, response);
  23. return;
  24. }
  25. }
  26. arg2.doFilter(arg0, response);
  27. }
  28. public void destroy() {
  29. }
  30. public void init(FilterConfig filterconfig1) throws ServletException {
  31. }
  32. }


 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号