Rails帖子无法验证CSRF令牌的真实性

时间:2016-05-20 03:56:49

标签: javascript jquery ruby-on-rails ajax csrf

我查了WARNING: Can't verify CSRF token authenticity rails 但是我仍然无法弄清楚它为什么会导致这个错误。

这是我的ajax

 $.post(
      "<%= ajax_chats_path %>",
      {timestamp :(new Date()).getTime(),msg: $('#msg').val()},
      function (json) {
      console.log(json);
    });

如果我添加此

skip_before_action :verify_authenticity_token

在控制器中,它可以解决这个问题。

我不确定这是正确的方法,因为它看起来可能会遇到一些安全攻击。

2 个答案:

答案 0 :(得分:5)

您在Ajax调用中缺少CSRF令牌。您需要使用长格式$ .ajax调用,并添加:

$.post

而不是$.ajax,您可以使用$.ajax({ type: "POST", url: "<%= ajax_chats_path %>", beforeSend: $.rails.CSRFProtection, data: { timestamp: (new Date()).getTime(), msg: $('#msg').val(), beforeSend: $.rails.CSRFProtection }, success: function (json) { console.log(json); } }); 等价物,如下所示:

datatype

您还应该强烈考虑在调用中添加{{1}}字段,以便jQuery知道响应的处理并相应地处理它。你可以选择任何&#34; xml&#34;,&#34; json&#34;,&#34; html&#34;,&#34; script&#34;,&#34; jsonp&#34; ,或&#34;文字&#34;。有关详细信息,请参阅jQuery.ajax() API documentation

答案 1 :(得分:1)

这对我有用,

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