23

当我尝试从 POST 时RestKit,Rails 控制台中出现警告:

Started POST "/friends" for 127.0.0.1 at 2012-04-16 09:58:10 +0800
Processing by FriendsController#create as */*
Parameters: {"friend"=>{"myself_id"=>"m001", "friend_id"=>"f001"}}
WARNING: Can't verify CSRF token authenticity
(0.1ms)  BEGIN
SQL (1.7ms)  INSERT INTO `friends` (`friend_id`, `myself_id`) VALUES ('f001', 'm001')
(1.1ms)  COMMIT
Redirected to http://127.0.0.1:3000/friends/8
Completed 302 Found in 6ms (ActiveRecord: 3.0ms)

这是客户端代码:

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
[attributes setObject: @"f001" forKey: @"friend_id"];
[attributes setObject: @"m001" forKey: @"myself_id"];
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:attributes forKey:@"friend"];
[[RKClient sharedClient] post:@"/friends" params:params delegate:self];

我怎样才能摆脱警告?

4

1 回答 1

73

您可以使用以下方法安全地删除警告:

skip_before_filter  :verify_authenticity_token

这应该进入你拥有的每个 Rails API 控制器,或者如果你有一个base_controller适用于所有 API 控制器的控制器,那么把它放在那里。

如果您还可以通过 Web 浏览器访问您的应用程序,则不要将此行放入其中,application_controller因为您将创建安全漏洞。

删除csrfAPI 调用是安全的,因为特定漏洞只能通过 Web 浏览器执行。

2013 年 12 月 16 日更新

我已经看到了一些指向这个答案的链接和一些其他内容,这些内容暗示了一个澄清。如果您使用基于 Web 的身份验证方法来验证 API(例如会话或 cookie),则 API 可能容易受到 CSRF 的攻击。

您的 Web API 是否容易受到CSRF攻击?.

我的建议仍然适用于 RestKit 的用户,因为用户凭据不太可能基于会话或 cookie,而是基于用户名或 api 密钥。

如果您的 API 可以通过会话或 cookie 进行身份验证,那么您应该避免跳过: verify_authenticity_token,并且应该考虑转向基于 api 密钥的身份验证。

如果您的 API 可以使用也用于在 Web 上进行身份验证的用户名和密码进行身份验证,那么仍然存在潜在的漏洞,尽管它不那么严重,因为它需要用户在您的站点中输入他们的用户名和密码访问带有漏洞的站点时的 HTTP Auth 质询框。同样,为了获得最佳安全性,您应该考虑转向基于 api 密钥的身份验证。

值得注意的是,我不同意你需要添加:only => [:your_method]额外的保护,前提是你有独立的 api 控制器,你的 api 没有与你的 web 响应混合,并且你没有使用 session 或 cookie。如果这些都到位,您可以安全地将其添加skip_before_filterbase_controller您的 api 中。

于 2012-04-27T01:41:05.430 回答