我有一个接受和返回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层中添加一些输入编码/验证。
请让我知道我的评估是否正确,以及我需要注意的任何其他问题
发布于 2021-01-28 21:05:35
我认为这里的任何XSS问题都是客户端的漏洞,这是正确的。如果客户端将HTML插入到文档中,则它有责任应用任何必要的编码。
客户端知道需要什么编码,而不是服务器。对于相同的数据,不同的位置可能需要不同的编码,或者不需要编码。例如:
如果一个客户做了类似这样的事情:
$(div).html("<b>" + repos + "</b>");
那么它就很容易受到XSS的攻击,所以repos
需要在这里进行编码。
但是如果它做了类似这样的事情:
$(div).append($("<b>").text(repos));
那么HTML编码将导致HTML实体代码被错误地显示给用户。
或者,如果客户端想要对数据进行某些处理,它可能希望先对明文数据进行处理,然后对其进行编码以输出数据。
输入验证也会有所帮助,但什么是有效输入的规则可能与没有编码就可以安全使用的规则不一致。像与号、引号和括号这样的东西也可以出现在有效的文本数据中。但是,如果您的数据不能包含这些字符,您可以拒绝无效的输入。
发布于 2021-01-28 07:11:51
我认为您的api是易受攻击的,尽管脚本可能无法执行。谈到XSS预防,我们总是建议在api处理输入时对危险字符进行解码/验证。有一个共同的需求:“在将数据存储到数据库之前清理数据”。
对于您的情况,api只响应了一个json,但我们不知道json中的数据将用于何处。通常前端不需要任何解码/验证就可以接受数据,如果这样,就会有一个xss。
您谈到客户端使用解码他们从您的api获得的数据。是的,我同意,但是前端总是“信任”后端,这样他们就不会解码数据。但是api服务器不应该信任来自前端的任何输入,因为这可能被(恶意)用户控制/更改。
发布于 2021-01-29 10:04:25
您的API不会受到XSS的攻击,除非它还提供了一个使用它的UI。这将是你的API的客户端可能是易受攻击的-他们将需要确保他们正确地编码任何来自你的API的数据,然后在任何UI中使用它。
https://stackoverflow.com/questions/65931025
复制