使用自定义的必需HTTP头作为API的CSRF的保护方法是否安全?

时间:2017-07-19 22:46:34

标签: json rest api security csrf

我有一个为SPA构建的JSON API,它只接受" Accept:application / json"头。因此,在浏览器中提交以下表单将导致"不可接受。" HTTP错误。

<form method="POST" action="https://api.example.domain/resource">
    <input type="password" name="password" value="CSRF">
    <input type="submit" value="Click!">
</form>

是否意味着API对CSRF类型的攻击有免疫力,或者我错过了什么?

2 个答案:

答案 0 :(得分:3)

它应该非常安全,但仍然存在API易受攻击的可能性。

如果攻击者可以在网站中找到XSS漏洞,则可以使用JavaScript添加标头:Accept: application/json,然后执行CSRF攻击。

出于这个原因,值得推荐的是依赖一些JavaScript无法设置的标头,因为它们位于“禁止”标题列表中,只有浏览器可以修改它们,因此这里不能使用XSS漏洞。

您可以在OWASP中找到更多信息:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

答案 1 :(得分:1)

我认为它不安全,因为您无法一次实施所有预防方法。当然,添加CORS支持,HTTP Only标记和其他方法可能会阻止您被黑客入侵,但您并不完全安全。

不是通过实施所有预防方法来重新发明轮子,我认为最好使用现有的标准包装器或中间件来防止对应用程序的CSRF攻击。这些代码比你能做的更好地清理输入。

您可以使用最好的(我最喜欢的包装器)之一https://github.com/ring-clojure/ring-anti-forgery来阻止CSRF攻击。如果您将节点用于后端目的,那么另一个最好的中间件https://github.com/expressjs/csurf

我不会说不可能自己编写整个代码以防止CSRF攻击,但我认为使用现有标准代码并专注于开发功能的聪明方法将节省更多的时间。