JSON API 的 XSS 漏洞
Posted
技术标签:
【中文标题】JSON API 的 XSS 漏洞【英文标题】:XSS vulnerability for JSON API 【发布时间】:2021-05-01 23:43:55 【问题描述】:我有一个接受和返回 JSON 数据的 REST API。
一个示例请求响应如下
请求
"repos": [
"some-repo",
"test-repo<script>alert(1)</script>"
]
回应
"error": "Error Message",
"repos": [
"test-repo<script>alert(1)</script>"
]
我的 API 是否容易受到 XSS 攻击?据我了解,由于 Content-Type 设置为 application/json,因此 API 本身不受 XSS 影响。客户端需要确保对输出进行编码以防止任何 XSS 攻击。 要添加额外的安全层,我可以在 API 层中添加一些输入编码/验证。
请告诉我我的评估是否正确以及我需要注意的任何其他问题
【问题讨论】:
【参考方案1】:我认为这里的任何 XSS 问题都是客户端的漏洞是正确的。如果客户端将 html 插入到文档中,则它有责任应用任何必要的编码。
客户端知道需要什么编码,而不是服务器。对于相同的数据,在不同的地方可能需要不同的编码,或者不需要编码。例如:
如果客户做了类似的事情:
$(div).html("<b>" + repos + "</b>");
那么它将容易受到 XSS 的攻击,因此 repos
需要在此处进行 HTML 编码。
但如果它做了类似的事情:
$(div).append($("<b>").text(repos));
那么 HTML 编码会导致 HTML 实体代码错误地显示给用户。
或者如果客户端想要对数据做一些处理,它可能希望明文数据先做处理,然后再编码输出。
输入验证也有帮助,但有效输入的规则可能与无需编码即可安全使用的规则不一致。与号、引号和括号之类的东西也可以出现在有效的文本数据中。但如果您的数据不能包含这些字符,您可以将输入视为无效而拒绝。
【讨论】:
【参考方案2】:您的 API 不会受到 XSS 攻击,除非它还提供使用它的 UI。您的 API 客户端可能易受攻击 - 他们需要确保在任何 UI 中使用 API 中的任何数据之前正确编码。
【讨论】:
【参考方案3】:我认为您的 api 很容易受到攻击,尽管脚本可能无法执行。谈到 XSS 预防,我们总是建议在 api 处理输入时解码/验证危险字符。有一个共同的要求“在将数据存储到数据库之前对其进行清理”。 至于你的情况,api只是响应一个json,但我们不知道json中的数据将用于何处。通常前端接受数据而不进行任何解码/验证,如果那样,就会有一个 xss。 您谈到客户端使用解码从您的 api 获得的数据。是的,我同意,但是前端总是“信任”后端,这样他们就不会解码数据。但 api 服务器不应信任来自前端的任何输入,因为这可以由(恶意)用户控制/更改。
【讨论】:
以上是关于JSON API 的 XSS 漏洞的主要内容,如果未能解决你的问题,请参考以下文章