代码之家  ›  专栏  ›  技术社区  ›  Darryl H. Thomas

将CSRF保护与RESTful API相结合的一些可行技术是什么?

  •  27
  • Darryl H. Thomas  · 技术社区  · 16 年前

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

    一个实际例子:

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

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

    当像CSRF保护因子这样的东西进入时,“单边”方法就崩溃了。CSRF保护令牌需要包含在API使用者发送的任何发布/放置/删除中。

    我一直在考虑如何最好地解决这个问题。每次需要进行API调用时都请求一个表单似乎非常困难(尤其是在处理异步操作时),但我自己想到的所有其他替代方法似乎都会破坏CSRF保护(或至少在其中穿孔),这是不可接受的。

    你们中有人了解这个吗?

    谢谢。

    (这不应该太重要,因为这是一个概念性的和平台无关的问题,但是我正在处理一个传统的灯栈,并使用symfony 1.4作为我的应用框架。我的目标是发布一个JSON格式的Web API,使开发人员能够使移动/桌面应用程序与现有的Web应用程序配合使用。)

    1 回复  |  直到 15 年前
        1
  •  2
  •   Zoran Regvart    16 年前

    REST与身份验证(即基本身份验证)非常匹配,因此尝试使用用户站点的用户名和特定于绑定到该用户的应用程序的密码——这项技术有时称为API密钥。FriendFeed的API正在做的事情 see the documentation .

    几点困难:

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