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

时间:2010-02-15 17:13:41

标签: web-services security rest csrf

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

一个实际的例子:

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

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

当CSRF保护因素出现时,“单边”方法就会崩溃。需要在API消费者发送的任何POSTS / PUTS / DELETES中包含CSRF保护令牌。

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

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

感谢。

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

1 个答案:

答案 0 :(得分:2)

REST在身份验证(即基本身份验证)方面表现相当不错,因此请尝试使用您的用户站点的用户名和特定于绑定到该用户的应用程序的密码 - 有时称为API密钥的技术。 FriendFeed的API正在做的事情see the documentation

很少有人注意到:

  • 使用摘要式身份验证或SSL
  • 每个应用程序的API密钥可能有点开销,因此大多数网站都有针对所有第三方应用程序的单个API密钥
  • OAuth可能值得一试