Rails似乎忽略了AJAX請求的真實性令牌。例如,我特意改變了我的AJAX調用,使用無效的令牌來測試它,並且請求似乎正常進行。Rails 3忽略AJAX請求真實性令牌
應用程序有默認的配置文件來使用會話cookie存儲和已在ApplicationController中的protect_from_forgery電話。
任何想法還有什麼我可能會錯過?
Rails似乎忽略了AJAX請求的真實性令牌。例如,我特意改變了我的AJAX調用,使用無效的令牌來測試它,並且請求似乎正常進行。Rails 3忽略AJAX請求真實性令牌
應用程序有默認的配置文件來使用會話cookie存儲和已在ApplicationController中的protect_from_forgery電話。
任何想法還有什麼我可能會錯過?
編輯>>我在博客張貼了這個答案還有: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代碼文檔找到。
protect_from_forgery增加了的before_filter上verify_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限制。
從Rails 3.0.4開始已經發生了變化 - 現在AJAX請求還需要提供令牌。參見[這次提交](https://github.com/rails/rails/commit/ae19e4141f27f80013c11e8b1da68e5c52c779ea) – jamuraa 2011-05-06 12:32:39
@jamuraa感謝指點出來。我有一個後續的博客文章關於此位置:http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html – zzawaideh 2011-05-06 15:33:55
無上述鏈接爲zadasnotes.blogspot.com工作.... – 2013-12-10 12:55:07