CSRF攻击是否适用于API?
特别是,我正在编写一个Django RESTful API来支持iOS应用程序,并且每当我编写处理POST请求的方法时,我都会继续运行在Django的CSRF保护中。
我的理解是,由iOSpipe理的cookie不会被应用程序共享,这意味着我的会话cookie是安全的,没有其他应用程序可以骑在它们上面。 这是真的? 如果是这样,我可以将我所有的API函数都标记为CSRF-exempt吗?
这不是CSRF的目的。 CSRF是防止直接发布数据到您的网站。 换句话说,客户端必须通过批准的path ,即查看表单页面,填写表格,提交数据。
一个API几乎排除了CSRF,因为它的全部目的通常是允许第三方实体访问和操作你的站点上的数据(CSRF中的“跨站点”)。 所以,是的,我认为任何API视图都应该是CSRF豁免。 但是,您仍然应该遵循最佳实践并保护每个实际上通过某种forms的身份validation(例如OAuth)进行更改的API端点。
CSRF攻击依赖于cookies与所有请求隐式发送到特定域。 如果你的API端点不允许基于cookie的authentication,你应该是好的。
即使您使用基于cookie的身份validation,您的Cookie也是安全的,因为iOS应用程序不共享cookie 。 但是,除非您通过要求不寻常的用户代理头来故意阻止networking浏览器,否则另一方可能会构build使用您的API的基于浏览器的应用程序,如果您的API支持基于cookie的身份validation,则该应用程序将容易受到CSRF攻击不适用CSRF保护。
如果您也在使用您的API来支持网站,则可以申请。
在这种情况下,您仍然需要某种forms的CSRF保护,以防止某人在其他网站中embedded请求,从而对经过身份validation的用户的帐户产生驱车作用。
Chrome似乎在默认情况下拒绝了交叉源POST请求(其他浏览器可能不那么严格),但允许GET请求的交叉来源,所以您必须确保API中的任何GET请求都没有副作用。
目前接受的答案(2012年5月)基本上是正确的,除了当您使用基于会话的身份validation。 还值得一提的是CORS的作用。
简单的情况是,您访问foo.com
并且网站执行Javascript来向api.com/users/123
发出基于AJAX的DELETE请求,并以您的名义删除用户。 现在这并不总是可能的,因为CORS – 浏览器将阻止foo.com
向api.com
发出请求,除非api.com
明确将foo.com
列入白名单。 这也假定您正在使用基于会话的身份validation,而不是基于令牌的身份validation。 在基于会话的身份validation中,任何login到api.com
用户都可以在他们保持loginapi.com
时执行请求。如果您有基于令牌的身份validation(每个请求必须使用包含身份validation令牌的HTTP Authorization
标头制作),那么您是安全的。 基于会话的身份validation通过cookie隐式发送身份validation令牌。
一个稍微糟糕的情况是,如果你的一个受信任的CORS域名受到威胁 – 比如说你有一个不能净化Javascript的表单,并且用户通过这个表单将JS注入你的网站。 如果您使用的是基于会话的身份validation,那么访问该页面的身份validation用户将看到Javascript运行并发出API请求。 如果您使用基于会话的身份validation来执行API,那么这可能是灾难性的,而且是非常现实的可能性。
根据DRF文档,只要服务器使用经过身份validation的会话, API就容易受到CSRF攻击(而不是每次input密码)
解决scheme是
- 确保“安全”HTTP操作(如
GET
,HEAD
和OPTIONS
不能用于更改任何服务器端状态。 - 确保任何“不安全的”HTTP操作(例如
POST
,PUT
,PATCH
和DELETE
)始终需要一个有效的CSRF标记。