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
中。