CSRF攻击是否适用于API?

Ale*_*lex 51 python security api django

特别是,我正在写一个Django的RESTful API来支持iOS应用程序,和我一直运行到Django的CSRF保护,每当我写的方法来处理POST请求.

我的理解是iOS管理的cookie不会被应用程序共享,这意味着我的会话cookie是安全的,没有其他应用程序可以使用它们.这是真的?如果是这样,我可以将所有API函数标记为CSRF免除吗?

Chr*_*att 48

这不是CSRF的目的.CSRF旨在防止将数据直接发布到您的站点.换句话说,客户端必须实际发布批准的路径,即查看表单页面,填写表单,提交数据.

一个API几乎排除了CSRF,因为它的全部目的通常是为了第三方实体在您的网站(以下简称"跨站"在CSRF)访问和操作数据.所以,是的,我认为通常任何API视图都应该是CSRF豁免.但是,您仍应遵循最佳实践并保护实际通过某种形式的身份验证(例如OAuth)进行更改的每个API端点.

  • 简单.你不允许它.我所知道的API不允许您使用API​​*实际创建帐户*.您可以通过其网站创建帐户,然后使用API​​密钥对您的请求进行身份验证. (11认同)
  • 用户注册怎么样?这是我最重要的一个,因为我现在的写作方式,没有CSRF和(显然)没有登录,没有什么能阻止某人通过虚假注册充斥我的服务. (5认同)
  • 然后Twitter等人怎么做.通过原生iOS视图支持注册?我的直觉告诉我这是一个API调用,但安全性原因让我觉得情况并非如此. (5认同)
  • 这不是真的.CSRF攻击依赖于存储为cookie的当前经过身份验证的会话令牌,以便浏览器在将数据发布到站点时将重用此会话令牌.仅仅因为您的API暴露给第三方并不意味着您不想对它们进行身份验证,因此您应该在基于会话令牌进行身份验证时至少验证CSRF令牌. (3认同)

Nic*_*ack 46

CSRF攻击依赖于将cookie与所有请求一起隐式发送到特定域.如果您的API端点不允许基于cookie的身份验证,那么您应该很好.

即使您使用基于cookie的身份验证,您的cookie也是安全的,因为iOS应用程序不共享cookie.但是,除非您通过要求不寻常的用户代理标头故意阻止Web浏览器,否则另一方可以构建使用您的API的基于浏览器的应用程序,如果您的API支持基于cookie的身份验证,该应用程序将容易受到CSRF攻击不适用CSRF保护.


Jam*_*mes 16

如果您还使用API​​来支持网站,它们确实适用.

在这种情况下,您仍然需要某种形式的CSRF保护,以防止有人在其他站点中嵌入请求,以对经过身份验证的用户的帐户产生偷渡效果.

Chrome似乎默认拒绝跨源POST请求(其他浏览器可能不那么严格),但允许GET请求跨域,因此您必须确保API中的任何GET请求都没有副作用.

  • 您可以通过使用javascript提交表单来执行跨源帖子. (4认同)
  • @NickRetallack幸运的是,没有任何表单可以使用任何自定义标头POST跨域.因此,所有人需要做的是需要POST的自定义标头. (2认同)

ale*_*emb 9

除了使用基于会话的身份验证之外,当前接受的答案(2012年5月)大多是正确的.还值得一提的是CORS的作用.

简单的场景是您访问foo.com并且网站执行Javascript以发出基于AJAX的DELETE请求api.com/users/123并最终代表您删除用户.现在,由于CORS,这并不总是可行的 - 除非明确列入白名单foo.com,api.com否则浏览器将阻止发出请求.这也假设您使用基于会话的身份验证API,而不是基于令牌的身份验证.在基于会话的身份验证中,登录的任何用户都可以在登录时执行请求.如果您具有基于令牌的身份验证(每个请求必须使用包含身份验证令牌的HTTP 头进行制作),那么您就是安全的.基于会话的身份验证通过cookie隐式发送身份验证令牌.api.comfoo.comapi.comAuthorization

稍微糟糕的情况是,如果您的一个受信任的CORS域遭到入侵 - 比如说您有一个不清理Javascript的表单,并且用户设法通过该表单将JS注入您的站点.如果您使用基于会话的身份验证,则访问该页面的经过身份验证的用户将看到Javascript运行并发出API请求.如果您对API使用基于会话的身份验证,这可能是灾难性的,并且非常可能.


neh*_*iah 6

根据DRF 文档,只要服务器使用经过身份验证的会话(而不是每次都询问密码),API 就容易受到 CSRF 攻击

解决办法是

  1. 确保“安全”HTTP 操作(例如GETHEAD和 ) OPTIONS不能用于更改任何服务器端状态。
  2. 确保任何“不安全”HTTP 操作(例如POSTPUTPATCHDELETE始终需要有效的 CSRF 令牌。

  • API 客户端(即移动应用程序、Ajax 调用)如何提供有效的 CSRF 令牌? (2认同)