JSON HTTP API 中的编码输出

信息安全 xss api 编码 json
2021-09-05 10:52:28

我是 JSON REST API 的作者。此 REST API 由各种客户端使用,例如 HTML/JS 客户端、.NET 客户端(控制台应用程序)和 Ruby 客户端。API 的输出是 JSON 格式,所以它是根据 JSON 规则进行格式化的,必要的特殊字符被转义了。

一位安全研究人员向我报告了这一点<并且>没有在输出中转义,因此如果攻击者使用 JSON 正文执行HTTP POST https://my.api.example.com/blabla{Value:"<Hello>"}之类的请求,那么我的 API 将输出类似{Response:"<Hello> is not a valid value"}.

安全研究人员随后解释说,攻击者可能能够通过使用它来执行反射跨站点脚本。

我的 JSON API 总是返回一个Content-Type: application/json标头,所以我的理解是现代客户端不会尝试将其解释为 HTML。

<并且>是我的 API 中的有效字符,因此我无法将其过滤掉。一种选择是对输出中的字符进行编码,但 JSON API 中的 HTML 编码字符对我来说似乎有点奇怪。第三种选择是只从输出中删除字符串,而是说“提供的值无效”之类的内容,但这会稍微降低可用性。

有没有什么好的常见做法来处理这个问题?

3个回答

在某种程度上,这是一个见仁见智的问题,但我不同意这里存在漏洞。如果客户端在没有经过任何处理的情况下从您的 JSON 响应中反射 HTML 数据,则它是该客户端中的漏洞,而不是您的 API 中的漏洞。任何网页都应将 API 响应视为不受信任的数据。

您是正确的,HTML 编码响应是一个坏主意。为什么 API 应该对客户端的正确编码做出任何假设?如果您想将 API 用于移动应用程序以及数据将在非 HTML 上下文中显示的地方怎么办?HTML 编码只是糟糕的设计。这将解决服务器端客户端的问题。

相反,我要做的是清楚地记录输出可能包含 HTML 特殊字符,并且客户端应该采取适当的措施。

不过,有一件事:确保使用无嗅探标头进行响应。没有它,mime 嗅探浏览器可以将响应解释为 HTML 或 JS,这将是一个真正的漏洞。

您可以依赖 Content-Type 标头吗?

正如对这个 security.stackexchange.com question的回答中所说的那样,在安全性方面,我们不能依赖客户端来尊重内容类型标头。

如何编码 JSON?

OWASP 为您的具体情况提供建议他们说如果上下文是 HTML,那么您就为该上下文编码您的输出。他们还说:

直接在 JavaScript 中转义和取消转义 JSON 的另一种方法是在将 JSON 传递给浏览器之前,通过将 '<' 转换为 '\u003c' 来规范化 JSON 服务器端。

首先,标题没有什么可以严格依赖的。虽然这个潜在的 XSS 漏洞现在可能不是问题,但您无法确切知道您的 API 将来将如何使用。在未来的某个地方,有人可能会在 HTML 中使用响应值,从而打开了一些 XSS 的可能性。

这本身可能不是您的问题,您仍然应该验证您的输入并清理您的输出。

  • 输入中的有效字符究竟是什么情况<>
  • <>每当输入与先前定义的场景不匹配时,删除会不会很痛苦?
  • 使用您的第三个选项会伤害吗?这可能是最容易实现的。

与任何事情一样,OWASP 为 Web 开发人员提供了一个很好的指南(称为“备忘单”),介绍如何防止 XSS(尤其是在 JSON 中)。他们json-sanitizer 在 GitHub 上的项目可能也值得一试。