当前位置:   article > 正文

Java - Spring Boot项目抵御XSS攻击_springboot xss反射型和存储型

springboot xss反射型和存储型

目录

 1、XSS危害(跨站脚本攻击)

 2、XSS攻击方式

 3、实现抵御XSS攻击


 

        XSS意思是跨站脚本攻击,英文全称Cross Site Scripting,为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。 

 1、XSS危害(跨站脚本攻击)

XSS(跨站脚本攻击)的危害包括:

        1. 窃取用户信息:攻击者可以利用XSS漏洞来窃取用户的敏感信息,如用户名、密码、银行账号等。

        2. 控制用户会话:攻击者可以利用XSS漏洞来劫持用户的会话,从而实施恶意操作,如发送恶意请求、修改用户设置等。

        3. 恶意重定向:攻击者可以利用XSS漏洞来将用户重定向到恶意网站,从而导致用户受到钓鱼攻击或安装恶意软件。

        4. 破坏网站功能:攻击者可以利用XSS漏洞来篡改网站内容,破坏网站功能,甚至导致网站崩溃。

        5. 影响搜索引擎排名:如果网站受到XSS攻击,搜索引擎可能会将其标记为不安全,从而影响网站的排名和信誉。

        总的来说,XSS攻击可能会给用户和网站带来严重的安全风险和经济损失。因此,开发人员和网站管理员应该及时发现和修复XSS漏洞,以保护用户和网站的安全。

2、XSS攻击方式

        XSS(跨站脚本攻击)是一种利用Web应用程序的漏洞,向页面注入恶意脚本,从而在用户的浏览器中执行恶意代码的攻击方式。XSS攻击的方式主要包括以下几种:

        1. 存储型XSS攻击:攻击者将恶意脚本存储在Web应用程序的数据库中,当用户访问包含恶意脚本的页面时,恶意脚本会从数据库中加载并在用户的浏览器中执行。

        2. 反射型XSS攻击:攻击者将恶意脚本作为参数附加到URL中,当用户点击包含恶意脚本的链接时,恶意脚本会被发送到服务器并在用户的浏览器中执行。

        3. DOM型XSS攻击:攻击者利用前端JavaScript动态生成页面的特性,通过修改页面的DOM结构来执行恶意脚本。

        攻击者通常利用XSS攻击来窃取用户的敏感信息、劫持用户的会话、破坏网站功能等。为了防范XSS攻击,开发人员需要对输入的数据进行严格的过滤和转义,避免将未经处理的用户输入直接输出到页面上。同时,网站管理员也需要定期对网站进行安全审计,及时发现和修复XSS漏洞。

 3、实现抵御XSS攻击

        首先我们要创建一个执行转义的封装类XssHttpServletRequestWrapper,这个类继承HttpServletRequestWrapper父类。 在这个类中我们需要把获取请求头和请求体数据的方法都要重写,返回的是经过XSS转义后的数据。

        需要用到hutool工具包,引入依赖。 

  1. <dependency>
  2. <groupId>cn.hutool</groupId>
  3. <artifactId>hutool-all</artifactId>
  4. <version>5.4.0</version>
  5. </dependency>
  1. import cn.hutool.core.util.StrUtil;
  2. import cn.hutool.http.HtmlUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import javax.servlet.ReadListener;
  5. import javax.servlet.ServletInputStream;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletRequestWrapper;
  8. import java.io.*;
  9. import java.nio.charset.Charset;
  10. import java.util.LinkedHashMap;
  11. import java.util.Map;
  12. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  13. public XssHttpServletRequestWrapper(HttpServletRequest request) {
  14. super(request);
  15. }
  16. @Override
  17. public String getParameter(String name) {
  18. String value = super.getParameter(name);
  19. if (!StrUtil.hasEmpty(value)) {
  20. // 清除所有HTML标签,但是保留标签内的内容,达到转义的效果
  21. value = HtmlUtil.cleanHtmlTag(value);
  22. }
  23. return value;
  24. }
  25. @Override
  26. public String[] getParameterValues(String name) {
  27. String[] values = super.getParameterValues(name);
  28. if (values != null) {
  29. for (int i = 0; i < values.length; i++) {
  30. String value = values[i];
  31. if (!StrUtil.hasEmpty(value)) {
  32. value = HtmlUtil.cleanHtmlTag(value);
  33. }
  34. values[i] = value;
  35. }
  36. }
  37. return values;
  38. }
  39. @Override
  40. public Map<String, String[]> getParameterMap() {
  41. Map<String, String[]> parameters = super.getParameterMap();
  42. LinkedHashMap<String, String[]> map = new LinkedHashMap();
  43. if (parameters != null) {
  44. for (String key : parameters.keySet()) {
  45. String[] values = parameters.get(key);
  46. for (int i = 0; i < values.length; i++) {
  47. String value = values[i];
  48. if (!StrUtil.hasEmpty(value)) {
  49. value = HtmlUtil.cleanHtmlTag(value);
  50. }
  51. values[i] = value;
  52. }
  53. map.put(key, values);
  54. }
  55. }
  56. return map;
  57. }
  58. @Override
  59. public String getHeader(String name) {
  60. String value = super.getHeader(name);
  61. if (!StrUtil.hasEmpty(value)) {
  62. value = HtmlUtil.cleanHtmlTag(value);
  63. }
  64. return value;
  65. }
  66. @Override
  67. public ServletInputStream getInputStream() throws IOException {
  68. InputStream in = super.getInputStream();
  69. InputStreamReader reader = new InputStreamReader(in, Charset.forName("UTF-8"));
  70. BufferedReader buffer = new BufferedReader(reader);
  71. StringBuffer body = new StringBuffer();
  72. String line = buffer.readLine();
  73. while (line != null) {
  74. body.append(line);
  75. line = buffer.readLine();
  76. }
  77. buffer.close();
  78. reader.close();
  79. in.close();
  80. Map<String, Object> map = JSONUtil.parseObj(body.toString());
  81. Map<String, Object> result = new LinkedHashMap<>();
  82. for (String key : map.keySet()) {
  83. Object val = map.get(key);
  84. if (val instanceof String) {
  85. if (!StrUtil.hasEmpty(val.toString())) {
  86. result.put(key, HtmlUtil.cleanHtmlTag(val.toString()));
  87. }
  88. } else {
  89. result.put(key, val);
  90. }
  91. }
  92. String json = JSONUtil.toJsonStr(result);
  93. ByteArrayInputStream bain = new ByteArrayInputStream(json.getBytes());
  94. return new ServletInputStream() {
  95. @Override
  96. public int read() throws IOException {
  97. return bain.read();
  98. }
  99. @Override
  100. public boolean isFinished() {
  101. return false;
  102. }
  103. @Override
  104. public boolean isReady() {
  105. return false;
  106. }
  107. @Override
  108. public void setReadListener(ReadListener readListener) {
  109. }
  110. };
  111. }
  112. }

        接下来我们要创建一个Filter类XssFilter,拦截所有的HTTP请求,然后调用上面创建的XssHttpServletRequestWrapper类,这样就能按照我们设定的方式获取请求中的数据了。

  1. import javax.servlet.*;
  2. import javax.servlet.annotation.WebFilter;
  3. import javax.servlet.http.HttpServletRequest;
  4. import java.io.IOException;
  5. @WebFilter(urlPatterns = "/*")
  6. public class XssFilter implements Filter {
  7. @Override
  8. public void init(FilterConfig filterConfig) throws ServletException {
  9. }
  10. @Override
  11. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  12. HttpServletRequest request = (HttpServletRequest) servletRequest;
  13. XssHttpServletRequestWrapper wrapper = new XssHttpServletRequestWrapper(request);
  14. filterChain.doFilter(wrapper, servletResponse);
  15. }
  16. @Override
  17. public void destroy() {
  18. }
  19. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/150377
推荐阅读
相关标签
  

闽ICP备14008679号