2010-11-06 85 views
6

Rails似乎忽略了AJAX请求的真实性令牌。例如,我特意改变了我的AJAX调用,使用无效的令牌来测试它,并且请求似乎正常进行。Rails 3忽略AJAX请求真实性令牌

应用程序有默认的配置文件来使用会话cookie存储和已在ApplicationController中的protect_from_forgery电话。

任何想法还有什么我可能会错过?

回答

7

编辑>>我在博客张贴了这个答案还有:http://zadasnotes.blogspot.com/2010/11/rails-3-forgery-csrf-protection-for.html

EDIT 2 >>这对Rails 3.0.4变更。看到这里跟进后:http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html

研究了一段时间后,我决定挖比特到Rails代码文档找到。

从这里开始:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html#method-i-form_authenticity_token

protect_from_forgery增加了的before_filterverify_authenticity_token(如下所示):

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 95 
95:  def verify_authenticity_token 
96:   verified_request? || raise(ActionController::InvalidAuthenticityToken) 
97:  end 

而且verified_request?如下所示:

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 
104:  def verified_request? 
105:   !protect_against_forgery? || request.forgery_whitelisted? || 
106:   form_authenticity_token == params[request_forgery_protection_token] 
107:  end 

最后request.forgery_whitelisted?

# File actionpack/lib/action_dispatch/http/request.rb, line 126 
126:  def forgery_whitelisted? 
127:  get? || xhr? || content_mime_type.nil? || !content_mime_type.verify_request? 
128:  end 

通知XHR?。 xmlHttpRequest已列入白名单并且不在protect_from_forgery列表中。所以看起来这是通过设计。

对XMLHttpRequest的进一步研究后,它似乎有在跨域运行它们,这使得它无需对应用的XHR检查CSRF限制。

+1

从Rails 3.0.4开始已经发生了变化 - 现在AJAX请求还需要提供令牌。参见[这次提交](https://github.com/rails/rails/commit/ae19e4141f27f80013c11e8b1da68e5c52c779ea) – jamuraa 2011-05-06 12:32:39

+0

@jamuraa感谢指点出来。我有一个后续的博客文章关于此位置:http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html – zzawaideh 2011-05-06 15:33:55

+3

无上述链接为zadasnotes.blogspot.com工作.... – 2013-12-10 12:55:07