将CSRF保护与RESTful API相结合的有哪些可行技术?

Dar*_*mas 27 security rest web-services csrf

我很想知道人们在为他们的Web应用程序构建RESTful(或准RESTful)API时采取了哪些方法.

一个实际的例子:

假设您有一个基于浏览器的传统Web应用程序,它在所有表单上都使用CSRF保护.浏览器中显示的每种形式都包含一个带有CSRF保护令牌的隐藏输入.提交表单后,如果此输入与令牌的服务器端版本不匹配,则表单被视为无效.

现在假设您希望将Web应用程序公开为API(可能使用JSON而不是HTML).传统上,在发布API时,我认为事务是单方面的(意味着API使用者基于发布的API构建请求,而不是首先请求表单,然后使用返回的表单构建请求).

当像CSRF保护因素这样的事情时,"单边"方法就会崩溃.需要将CSRF保护令牌包含在API消费者发送的任何POSTS/PUTS/DELETES中.

我一直在努力思考如何最好地解决这个问题.每次需要进行API调用时请求一个表单看起来很尴尬(特别是在处理异步操作时),但我自己想到的所有其他替代方案似乎都破坏了CSRF保护(或至少打破了它的漏洞) ),这是不可接受的.

你们中有谁对此有所了解吗?

谢谢.

(并不是说它应该太重要,因为问题是概念和平台不可知的,但我正在处理传统的LAMP堆栈并使用Symfony 1.4作为我的应用程序框架.我的目标是发布一个JSON格式的Web API,允许开发人员使移动/桌面应用程序与现有的Web应用程序相得益彰.)

Zor*_*art 2

REST 与身份验证(即基本身份验证)配合得很好,因此请尝试使用用户站点的用户名和特定于绑定到该用户的应用程序的密码——有时称为 API 密钥的技术。FriendFeed 的 API 正在执行的操作请参阅文档

一些困难的注意事项:

  • 使用摘要身份验证或 SSL
  • 每个应用程序拥有 API 密钥可能会产生一些开销,因此大多数站点都为所有 3rd 方应用程序提供单个 API 密钥
  • OAuth可能值得一试

  • @kimsia 是的:CSRF 是一种特殊的未经身份验证的调用,其中浏览器中加载的页面已验证对另一个页面的访问(通常通过在整个浏览器中共享的会话 cookie)。如果您使用 OAuth 进行身份验证,则 OAuth 参数只有授权的浏览器页面才知道,因此其他页面无法利用共享的浏览器状态。是的,如果您需要防止 CSRF 和 MITM,您需要使用 SSL。 (2认同)