Rails在RestKit POST中显示“警告:无法validationCSRF令牌的真实性”

当我尝试从RestKit POST时,在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]; 

我怎样才能摆脱警告?

您可以安全地删除以下警告:

 skip_before_filter :verify_authenticity_token 

这应该进入您拥有的每个Rails API控制器,或者如果您拥有所有API控制器的base_controller ,那么将它放在那里。

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

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

2013年12月16日更新

我已经看到一些链接到这个答案和一些其他内容,这表明澄清。 如果您使用基于Web的身份validation方法对API进行身份validation(例如会话或cookie),则API可能容易受到CSRF攻击。

你的Web API是否容易受到CSRF的攻击? 。

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

如果您的API可以使用会话或cookie进行身份validation,那么您应该避免跳过: verify_authenticity_token ,您应该考虑转移到基于api密钥的身份validation。

如果您的API可以使用用户名和密码进行validation,这个用户名和密码也可以用来在networking上进行validation,但是仍然存在潜在的漏洞利用,尽pipe它不太严重,因为它需要用户在您的网站input用户名和密码HTTPvalidation挑战框,同时利用漏洞访问网站。 同样,为了最好的安全性,你应该考虑转向基于api密钥的authentication。

值得注意的是,我不同意你需要添加:only => [:your_method]来获得额外的保护,只要你有独立的api控制器,你的api不会与你的web响应混合在一起,而且你没有使用会话或cookies。 如果这些已经到位,您可以安全地将skip_before_filter添加到您的api的base_controller中。