json - JSON API 的 XSS 漏洞
问题描述
我有一个接受并返回 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 层中添加一些输入编码/验证。
请让我知道我的评估是否正确以及我需要注意的任何其他问题
解决方案
我认为这里的任何 XSS 问题都是客户端的漏洞是正确的。如果客户端将 HTML 插入到文档中,那么它有责任应用任何必要的编码。
客户端知道需要什么编码而不是服务器。对于相同的数据,在不同的地方可能需要不同的编码,或者不需要编码。例如:
如果客户做了类似的事情:
$(div).html("<b>" + repos + "</b>");
那么它将容易受到 XSS 的攻击,因此repos
需要在此处进行 HTML 编码。
但如果它做了类似的事情:
$(div).append($("<b>").text(repos));
那么 HTML 编码会导致 HTML 实体代码错误地显示给用户。
或者如果客户端想对数据做一些处理,它可能希望明文数据先做处理,然后再编码输出。
输入验证也可以提供帮助,但是关于什么是有效输入的规则可能与没有编码的情况下可以安全使用的规则不一致。与号、引号和括号之类的东西也可以出现在有效的文本数据中。但如果您的数据不能包含这些字符,您可以将输入视为无效而拒绝。