Rails从RestKit POST显示"警告:无法验证CSRF令牌真实性"

ohh*_*hho 22 ruby-on-rails ios ruby-on-rails-3 restkit

当我尝试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)
Run Code Online (Sandbox Code Playgroud)

这是客户端代码:

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];
Run Code Online (Sandbox Code Playgroud)

我该如何摆脱警告?

nmo*_*ott 71

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

skip_before_filter  :verify_authenticity_token
Run Code Online (Sandbox Code Playgroud)

这应该包含在您拥有的每个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可以使用用于在网络上进行身份验证的用户名和密码进行身份验证,那么仍然存在潜在的漏洞利用,尽管它不太严重,因为它要求用户在您的网站中键入其用户名和密码.使用漏洞访问网站时的HTTP Auth挑战框.同样,为了获得最佳安全性,您应该考虑转向基于api密钥的身份验证.

值得注意的是,我不同意你需要添加:only => [:your_method]额外的保护,只要你有孤立的api控制器,你的api没有与你的网络响应混合,你没有使用会话或cookie.如果这些已经到位,您可以安全地将其添加skip_before_filterbase_controller您的api中.

  • 为避免打开大洞,我建议您只为方法滑动验证.`skip_before_filter:verify_authenticity_token:only => [:your_method]` (30认同)
  • 对于那些剪切和粘贴上面代码的人:`skip_before_filter:verify_authenticity_token,:only => [:your_method]`Marc忘了逗号.DId没有看到编辑按钮. (15认同)