我是 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 编码字符对我来说似乎有点奇怪。第三种选择是只从输出中删除字符串,而是说“提供的值无效”之类的内容,但这会稍微降低可用性。
有没有什么好的常见做法来处理这个问题?