繁体   English   中英

Spring:如何在 RESTful 服务中为 @RequestBody 添加 XSS 保护?

[英]Spring: How to add XSS protection to @RequestBody in a RESTful service?

我试图通过在 XSS 过滤器中创建一个扩展 HttpServletRequestWrapper 的 RequestWrapper 来添加自定义 XSS 保护。 以下代码提供 XSS 保护以: 1. 请求参数 2. 有效负载。

public class XssRequestWrapper extends HttpServletRequestWrapper {

  XssRequestWrapper(HttpServletRequest request) {
    super(request);
  }

    @Override
    public String getQueryString() {
    /*
    Custom XSS logic 
    */
    }

    @Override
    public String getParameterMap() {
    /*
    Custom XSS logic 
    */
    }

    @Override
    public String getParameterValues() {
    /*
    Custom XSS logic 
    */
    }

}

但是,当我在控制器中使用 @RequestBody Annotation 配置我的 REST Api 时,不会调用覆盖的getParameterValues 相反,会调用getInputStream ,这会导致添加以下内容:

 @Override
  public ServletInputStream getInputStream() throws IOException {
    /*
    Custom XSS logic 
    */
  }

有没有更好/理想的方法来为通过 @RequestBody 注释传递的数据提供 XSS 保护?

编辑:解决方案: https : //www.baeldung.com/spring-reading-httpservletrequest-multiple-times因为我在以前的过滤器之一中使用了 ContentCachingRequestWrapper,所以我无法使用它,因此继续使用上述解决方案. 通过缓存请求,我能够多次读取它并对缓存的内容执行 XSS 检查。

我对您尝试使用代码实现的目标感到有些困惑。

首先,存在三种类型的跨站脚本 (XSS) 漏洞:

  1. 基于 DOM - 通常由于 JavaScript 中的缺陷而在浏览器中运行。 漏洞被利用不需要服务器调用。
  2. 反射型 XSS - 有效负载由 Web 服务器反映在 HTML 正文中。
  3. 持久性 XSS - 有效载荷位于数据库中,并由 Web 服务器嵌入 HTML 正文中。

因此,您无法使用请求包装器解决基于 DOM 的 XSS,因为不需要发出请求。

您可能会尝试解决第 2 点和第 3 点,但处理请求值是一件不常见的事情。 XSS 漏洞是上下文敏感的,如果您在不知道稍后使用该值的上下文的情况下尝试编码或转义 - 您可能会失败。

请查看OWASPXSS 预防备忘单,了解如何防止代码中的 XSS 缺陷。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM