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不是为了防止点击劫持,它是一个单独的攻击,其他网站可以让用户点击一个链接,用你的会话在你的网站上执行一个动作。