我用AJAXand发送数据从视图到控制器,我得到了这个错误:
警告:无法验证CSRF令牌的真实性
我想我必须用数据发送这个令牌。
有人知道我该怎么做吗?
编辑:我的解决方案
我通过在AJAX帖子中放入以下代码来做到这一点:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
我用AJAXand发送数据从视图到控制器,我得到了这个错误:
警告:无法验证CSRF令牌的真实性
我想我必须用数据发送这个令牌。
有人知道我该怎么做吗?
编辑:我的解决方案
我通过在AJAX帖子中放入以下代码来做到这一点:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
当前回答
如果有人需要与Uploadify和Rails 3.2相关的帮助(就像我在谷歌这篇文章时一样),这个示例应用程序可能会有帮助: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb
也检查控制器解决方案在这个应用程序
其他回答
我为这个问题纠结了好几天。任何GET调用都正常工作,但所有put都会生成“无法验证CSRF令牌真实性”错误。在我向nginx添加SSL证书之前,我的网站工作正常。
我终于在nginx设置中发现了这一行:
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https; # Needed to avoid 'WARNING: Can't verify CSRF token authenticity'
proxy_pass http://puma;
}
在添加了缺失的行“proxy_set_header X-Forwarded-Proto https;”之后,我的所有CSRF令牌错误都退出了。
希望这能帮助那些也在用头撞墙的人。哈哈
从一个旧的应用程序升级到rails 3.1,包括csrf元标记仍然不能解决这个问题。在rubyonrails.org的博客上,他们给出了一些升级技巧,特别是这一行jquery应该放在布局的头部部分:
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
摘自这篇博客:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails。
在我的例子中,会话在每次ajax请求时都被重置。添加上面的代码解决了这个问题。
如果你没有使用jQuery,而是使用类似于获取API的请求,你可以使用下面的方法来获取csrf-token:
文档。querySelector(“元[name =“csrf-token”]”)。getAttribute(“内容”)
fetch('/users', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')},
credentials: 'same-origin',
body: JSON.stringify( { id: 1, name: 'some user' } )
})
.then(function(data) {
console.log('request succeeded with JSON response', data)
}).catch(function(error) {
console.log('request failed', error)
})
我使用Rails 4.2.4,不知道为什么我得到:
Can't verify CSRF token authenticity
我在布局中有:
<%= csrf_meta_tags %>
在控制器中:
protect_from_forgery with: :exception
调用tcpdump - a -s 999 -i lo port 3000显示正在设置的报头(尽管不需要用ajaxSetup设置报头-它已经完成了):
X-CSRF-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
DNT: 1
Content-Length: 125
authenticity_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
最后它失败了,因为我关掉了cookie。如果不启用cookie, CSRF将无法工作,因此如果您看到此错误,这是另一个可能的原因。
如果有人需要与Uploadify和Rails 3.2相关的帮助(就像我在谷歌这篇文章时一样),这个示例应用程序可能会有帮助: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb
也检查控制器解决方案在这个应用程序