可以在提供非 HTML 响应的 REST API 上发生反射型 XSS跨站点脚本攻击

问题描述

可以在 REST API 上发生反射型 XSS(跨站点脚本)攻击,该 API 接受 XML 请求有效负载,提供 XML 响应。请求或响应中没有 html 内容

我已经阅读了很多关于 XSS 的文档,现在我认为这不适用于不提供 html 内容的 REST API,这种理解是否正确? 然而,我们正在对收到的请求进行验证,以检查输入中是否有任何类型的标签 (),以及其他一些业务级别的验证。

关于我们服务的几点,

  1. 我们的 REST API 不会接收或响应 HTML 数据。
  2. 我们不会直接从最终用户那里获得任何输入或请求 (攻击者的可能性主要来自恶意的最终用户
  3. 我们不会直接向最终用户发送 XML 响应/HTML 呈现 XSS 几率最高的系统(浏览器)。
  4. 我们接受请求并将响应传递给我们的内部服务 企业和值得信赖的(合作伙伴)。
  5. 我们发送的 XML 响应仅用于读取嵌入在 非 html 环境(这些是读取我们响应的受信任服务)。

这种情况下发生 XSS 的风险有多大?

(此查询背后的原因是我们收到了 checkmarx 高严重性错误,其中表明我们很容易发生反射型 XSS,我认为在我们的案例中这可能是误报。我们正在使用 Spring Boot 应用程序.)

解决方法

这主要取决于响应 content-type。只要它是类似 applicatiin/xmltext/xml(而不是 text/htmlapplication/xhtml)的东西,api 本身就不容易受到 xss 的攻击,因为现代浏览器不会运行即使显示脚本。

请注意,尽管它可能仍然容易受到 xml 注入,如果 Checkmarx 发现它是 xss,则可能存在某种可能的注入。确保用户无法在响应中创建 xml 标记或属性。这样做的方法与防止 xss 的方法非常相似。请注意,将用户输入写入 xml 时不需要对用户输入进行 html 编码,因为它不是 html,但您需要对值进行 xml 编码。

另请注意,验证输入很好,但一般来说,上下文感知输出编码可以防止注入攻击,即。将适当的编码类型应用于值、xml 属性等。很多时候,您无法在输入端完全实现这一点。 (输入验证仍然有意义,您也应该这样做,但最好通过输出编码来防止注入。)