2011-03-13 56 views

回答

16

此問題與Devise無關。簡而言之,由於Rails 3.0.4要求每個非GET請求都應該有CSRF令牌,否則會話被清除。

有現在將要求所有 非GET請求在此 固定兩個大的變化,當CSRF保護 未能改變了行爲和 令牌。

應用這個補丁失敗後CSRF 請求將不再生成HTTP 500錯誤,代替會議將 復位。用戶可以通過在其自己的 控制器中重寫 handle_unverified_request來覆蓋此行爲。

更多細節在這裏:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails

jQuery的片段與AJAX使用要求

$(document).ajaxSend(function(e, xhr, options) { 
    var token = $("meta[name='csrf-token']").attr("content"); 
    xhr.setRequestHeader("X-CSRF-Token", token); 
}); 

如果您使用的原型,你需要下面的代碼:

Ajax.Responders.register({ 
    onCreate: function(request) { 
    var csrf_meta_tag = $$('meta[name=csrf-token]')[0]; 

    if (csrf_meta_tag) { 
     var header = 'X-CSRF-Token', 
      token = csrf_meta_tag.readAttribute('content'); 

     if (!request.options.requestHeaders) { 
     request.options.requestHeaders = {}; 
     } 
     request.options.requestHeaders[header] = token; 
    } 
    } 
}); 
-1

我在Rails 3.0.5 + Devise(1.x + 1.2RC)中遇到了同樣的問題:用戶正在註銷某些AJAX請求。

現在唯一的解決方法是將Rails降級到3.0.3。

+0

好吧..我會保持3.0.3一段時間.. thanx! – 2011-03-16 04:08:18

4

我有同樣的麻煩,沒有一個阿賈克斯銷燬電話原來我只是在我的舊版面的標題中缺少<%= csrf_meta_tag%>。