Rails 3.1 – CSRF被忽略了吗?

在这里我的问题,

我有一个rails 3.1应用程序,我正在尝试发出ajax请求但是我收到警告消息“警告:无法validationCSRF令牌真实性”…

在我的布局中,我有辅助方法“csrf_method_tag” ,我添加了以下javascript代码(不知道是否真的需要):

$.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); } }); 

我的Gemfile包含gem jquery-rails (> = 1.0.12),我在application.js的顶部需要jquery和jquery-ujs。

即使这样,该消息仍然出现。 我忘了什么吗?

谢谢你的帮助。

什么对我<%= form_authenticity_token %> – 当没有表格工作时 – 是在ajax数据有效负载中包含<%= form_authenticity_token %>的结果。 所以我做的事情就像tehprofessor在html中建议的那样:

  

然后在javascript中:

 tokentag = $('#tokentag').val() submitdata = { "authenticity_token": tokentag, ...+whatever else you need to include+...} 

然后使用submitdata调用$.ajax

我遇到了同样的麻烦。 我试图抓住一个javascript事件(you_tube播放器完成)和Ajax回到我的服务器让我知道。 我得到了:

  警告:无法validationCSRF令牌的真实性 

每当jQuery ajax调用命中我的服务器。 我在上面添加了您的代码修复

 $.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); } }); 

它工作正常。 我认为唯一的区别在于我的布局

 <%= csrf_meta_tags %> 

而不是你在原帖中提到的csrf_method_tag。
所以,谢谢你的解决方案,这是在原帖中。

您可能甚至不需要在代码中使用它。 默认情况下, jquery-rails gem会自动在所有Ajax请求上设置CSRF令牌。

只需直接在您的AJAX调用上执行它就可以了!

  $.ajax({ type: //method, beforeSend: function(xhr){ xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) }, url: //parameter, dataType: 'html', success: function(data, textStatus, jqXHR) { // some code } }); 

您是否尝试过使用带有真实性令牌的隐藏表单元素?

  

我遇到了同样的错误,并解决了它。 这是因为我没有使用内置的表格助手……

一个原因可能是您在加载文档之前进行了AJAX调用,因此JQuery无法获得CSRF令牌。

问题是您需要在Ajax POST请求之后获取新令牌,因为一旦使用了令牌,它就会失效。 这是执行此操作的代码:

在发送POST回复时,在rails中将这些参数添加到响应中:

 def someMethod: result[:csrfParam] = request_forgery_protection_token result[:csrfToken] = form_authenticity_token render :json => result end 

现在在JS方面,在每个POST方法的成功函数中,您可以调用此函数:

 var setCsrfToken = function(param, token) { if(param == null || token == null) { console.error("New CSRF param/token not present"); } $("input[name='" + param + "']").val(token); } 

像这样:

 setCsrfToken(result["csrfParam"], result["csrfToken"]); 

此函数将重置所有POST表单中的所有authenticity_token参数,以便下一个请求具有有效的标记。 您需要确保在每次POST调用中都会发生这种情况,否则您将继续面临此问题。

此外,CSRF不是为了防止点击劫持,它是一个单独的攻击,其他网站可以让用户点击一个链接,用你的会话在你的网站上执行一个动作。