Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 铁路显示";警告:Can';t验证CSRF令牌的真实性”;从一个RestKit岗位_Ruby On Rails_Ios_Ruby On Rails 3_Restkit - Fatal编程技术网

Ruby on rails 铁路显示";警告:Can';t验证CSRF令牌的真实性”;从一个RestKit岗位

Ruby on rails 铁路显示";警告:Can';t验证CSRF令牌的真实性”;从一个RestKit岗位,ruby-on-rails,ios,ruby-on-rails-3,restkit,Ruby On Rails,Ios,Ruby On Rails 3,Restkit,当我尝试从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 to

当我尝试从
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];

我怎样才能摆脱这个警告呢

您可以通过以下方式安全地删除警告:

skip_before_filter  :verify_authenticity_token
这应该进入您拥有的每一个Rails API控制器,或者如果您有一个适用于所有API控制器的
base\u控制器
,那么就把它放在那里

如果您也可以通过web浏览器访问您的应用程序,则不要将此行放入
应用程序\u控制器
,因为您将创建一个安全漏洞

可以安全地删除API调用的
csrf
,因为特定漏洞只能通过web浏览器执行

2013年12月16日更新

我已经看到了一些链接,这些链接指向这个答案,还有一些其他的内容,建议进行澄清。如果使用基于web的身份验证方法对API进行身份验证(例如会话或cookie),则API可能容易受到CSRF的攻击

书中有一些很好的细节

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

如果您的API可以通过会话或cookie进行身份验证,那么您应该避免跳过
:验证\u真实性\u令牌
,并且您应该考虑转移到基于API密钥的身份验证

如果您的API可以使用用户名和密码进行身份验证,并且该用户名和密码也用于在web上进行身份验证,则仍然存在潜在的利用漏洞,尽管其严重程度较低,因为在使用该漏洞访问站点时,需要用户在HTTP Auth challenge框中键入其站点用户名和密码。同样,为了获得最佳安全性,您应该考虑转向基于api密钥的身份验证


值得注意的是,我不同意您需要添加
:only=>[:your_method]
以获得额外的保护,前提是您有独立的api控制器,您的api没有与web响应混合,并且您没有使用会话或cookie。如果这些都已准备就绪,您可以安全地将
skip\u before\u过滤器
添加到api的
base\u控制器
中。

为了避免打开一个大漏洞,我建议仅针对您的方法跳过验证<代码>过滤前跳过:验证真实性\u标记:仅=>[:您的\u方法]对于剪切和粘贴上述代码的人:
过滤前跳过:验证真实性\u标记,:仅=>[:您的\u方法]
马克忘记了逗号。没有看到编辑按钮。这确实有助于理解此问题,以及如果您有使用令牌的Rails API(以及响应常规web请求的控制器),如何解决此问题: