【发布时间】:2014-07-09 12:53:51
【问题描述】:
我一直在使用 API 实现 Rails 4 应用程序。我希望能够从手机和 webapp 本身调用 API。我在研究protect_from_forgery时遇到了this note:
请务必记住,XML 或 JSON 请求也会受到影响,如果您正在构建 API,您将需要以下内容:
class ApplicationController < ActionController::Base
protect_from_forgery
skip_before_action :verify_authenticity_token, if: :json_request?
protected
def json_request?
request.format.json?
end
end
我正在考虑这样做,但我有一些保留/问题:
- 这个解决方案似乎让 CSRF 漏洞打开了,因为现在攻击者可以使用
onclickjavascript 来制作一个链接来发布 JSON? - 检查 API 令牌是否是合理的替代方法?即,如果 api 令牌存在并且对于当前用户是正确的,而不是跳过真实性检查,而是允许它在检查失败并在
handle_unverified_request中恢复,该怎么办? - 或者我应该只制作网络应用程序和移动设备send the CSRF token in the HTTP headers?那安全吗?考虑到手机一开始没有呈现 HTML 表单,它如何获得 CSRF 令牌?
编辑澄清:
我更关心 webapp 用户点击精心制作的 CSRF 链接。移动用户经过身份验证、授权、拥有 API 密钥,所以我不关心他们。但是通过为 webapp 用户启用 CSRF 保护,移动用户被阻止使用受保护的 API。我想知道处理这个问题的正确策略,我不相信 Rails 文档给出了正确的答案。
【问题讨论】:
-
您有两种不同的场景:Web 应用程序和非 Web 应用程序。 CSRF 仅适用于 Web 应用程序,因为攻击依赖于利用现有的有效浏览器会话。因此,如果您使用浏览器会话进行身份验证,则需要使用 CSRF 令牌保护。如果您使用 API 密钥进行身份验证,那么您不会受到 CSRF 的影响,因为没有可用于伪造的有效会话。如果您在同一个 API 上使用这两种技术,则需要为每种请求类型使用适当的方法。
标签: ruby-on-rails json api ruby-on-rails-4 csrf