【问题标题】:Spring: How to add XSS protection to @RequestBody in a RESTful service?Spring:如何在 RESTful 服务中为 @RequestBody 添加 XSS 保护?
【发布时间】:2020-02-16 15:54:02
【问题描述】:

我正在尝试通过在 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 注解配置 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 检查。

【问题讨论】:

    标签: java spring security filter xss


    【解决方案1】:

    我对你试图用代码实现的目标有点困惑。

    首先要做的事 - 存在三种类型的跨站脚本 (XSS) 漏洞:

    1. 基于 DOM - 在浏览器中运行通常是由于 JavaScript 中的缺陷。无需服务器调用即可利用该漏洞。
    2. 反射型 XSS - 负载被 Web 服务器反射到 HTML 正文中。
    3. 持久性 XSS - 有效负载位于 DB 中,并由 Web 服务器嵌入到 HTML 正文中。

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

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

    请查看XSS prevention cheat sheet from OWASP,了解如何防止代码中出现 XSS 漏洞。

    【讨论】:

    • 感谢您的回复。为了清除,我正在尝试解决以下线程中的解决方案。 stackoverflow.com/questions/49439020/… 我正在尝试修复存​​储型 XSS 案例,其中在过滤器级别有一个输入验证来检查请求有效负载。
    • 在存储的 XSS 案例中,您想要转义的有效负载来自数据库,而不是来自请求。您可能想要处理反射型 XSS 案例。
    • 负载来自客户端。除了在我的前端处理反射型 XSS 之外,在某些情况下可以通过 REST 客户端发送有效负载。在这些情况下,我需要在过滤器级别的服务器逻辑中添加输入验证。
    • 您找到解决方案了吗?因为我也面临同样的问题并想逃避请求/响应正文
    • @NobesInd 我已附上问题的解决方案,请查看。另外,另一种方法是覆盖 HttpServletRequestWrapper 中的 getParameterValues,其中整个请求正文作为 JSON 字符串传递,通过它我们可以应用验证或转换。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2014-03-04
    • 2016-01-12
    • 2014-09-13
    • 2011-08-29
    • 2012-01-17
    • 2012-04-26
    • 2018-06-13
    相关资源
    最近更新 更多