如何检索CSRF令牌以传递JSON请求?
我知道所有请求类型(包括JSON / XML)的安全性原因Rails is checking the CSRF token .
我可以放入我的控制器 skip_before_filter :verify_authenticity_token
,但我会失去CRSF保护(不建议:-)) .
这类似(仍未被接受)answer建议
使用<%= form_authenticity_token%>检索令牌
问题是如何?我是否需要先对我的任何页面进行调用以检索令牌,然后使用Devise进行真正的身份验证?或者它是一个一次性的信息,我可以从我的服务器获得然后一致地使用(直到我在服务器本身手动更改它)?
11 回答
我这样解决了这个错误:
资料来源:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
令人担忧的是,在Rails 3.2.3中,我们现在在production.log中收到CSRF警告,但帖子没有失败!我希望它失败,因为它保护我免受攻击 . 你可以在过滤btw之前用jquery添加csrf标记:
http://jasoncodes.com/posts/rails-csrf-vulnerability
我用过下面的 . 使用include?所以如果内容类型是application / json; charset = utf-8那么它仍然有效 .
EDIT :
在Rails 4中,我现在使用@genkilabs在下面的评论中建议的内容:
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
这不是完全关闭内置安全性,而是在没有CSRF令牌的情况下杀死服务器时可能存在的任何会话 .
skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }
这将关闭已正确标记为json post / puts的CSRF检查 .
例如,在iOS中将以下内容设置为NSURLRequest,其中“parameters”是您的参数:
成功登录后,您可以使用自定义标头发送CSRF令牌 .
例如,将它放在你的会话#create中:
提供CSRF令牌的示例登录响应头:
此令牌在您再次登录之前有效,或者(如果您通过API支持,则退出) . 您的客户端可以从登录响应标头中提取和存储令牌 . 然后,每个POST / PUT / DELETE请求必须使用在登录时接收的值设置X-CSRF-Token标头 .
使用CSRF令牌的POST标头示例:
文件:form_authenticity_token
确实最简单的方法 . 不要在改变 Headers 时烦恼 .
确保你有:
在你的
layouts/application.html.erb
只做一个隐藏的输入字段,如下所示:
或者如果你想要一个jquery ajax帖子:
基本上当你发布你的json数据时,只需在
post
数据中添加一个有效的authenticity_token字段,警告就会消失......This answer更好 .
在任何XMLHttpRequest发送之前,您无需额外工作(附加令牌)即可保持CSRF-TOKEN验证 . 没有JQuery,没有什么只是复制/粘贴和刷新 .
只需添加此代码即可 .
我对以下版本的Rails有同样的问题:
gem 'rails',:git => 'git://github.com/rails/rails.git' ,: branch => '3-2-stable'
我更新到3.2.2,现在一切正常 . :)
宝石'rails','3.2.2'
我今晚遇到了同样的问题 . 发生这种情况的原因是,当您登录时,最后一个csrf-token不再有效 . 我做的是:你的app / views / devise / sessions / create.js.rb中的
$("meta[name=csrf-token]").attr('content', '<%= form_authenticity_token %>');
.现在它确实有一个有效的csrf-token :)我希望它有所帮助
也适用于开发/测试模式 .
此警告显示是因为您正在使用
:null_session
,在Rails 4.1中,如果未指定with:
选项,则它默认工作 .这不是一个错误 . 它应该在每个非GET请求上进行检查 . https://github.com/rails/rails/issues/3041