我有一个laravel应用程序,它在每个页面的字段中输出令牌。然后jquery将令牌加载到每个ajax请求,如下所示:Laravel 5 CSRF global token hidden field for all forms in a page
但每隔一段时间,我就会在ajax调用中获得TokenMismatch Exceptions。有时它会在网站闲置太久时发生,有时候它显然是随机的。
有关如何调试此问题的任何想法?可能导致这种情况或可能的解决方案的原因是什么?
答案 0 :(得分:1)
我认为您不应该关闭Kernel.php文件上的VerifyCsrfToken中间件,因为此操作可能会引发攻击。实际上,您需要使用令牌保护您网站的每个请求(不包括外部帖子到我们网站的情况,例如:mandrill状态帖子)。
设置元标记如下
<meta name="csrf-token" content="{{ csrf_token() }}">
然后请求如下
$.ajax({
data: {data1:'data1',data2:'data2'},
url: '/your/url/goes/here',
type: 'POST',
beforeSend: function (request) {
return request.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-token']").attr('content'));
},
success: function(response){
console.log(response);
}
})
答案 1 :(得分:0)
如果您需要执行AJAX请求,请关闭 Kernel.php 文件中的 VerifyCsrfToken 中间件。
您还可以编辑 VerifyCsrfToken.php 中间件文件,以此方式排除某些网址:
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'ajax/*',
'api/*',
];
答案 2 :(得分:0)
发生这种情况的原因很可能是以下情况之一:
你已经闲置太久了 - 默认情况下,CSRF令牌有效期为15分钟,我没有弄错。
您忘记将令牌传递给后端。只需在您的请求中添加X-CSRF-TOKEN
标头即可完成此操作。
答案 3 :(得分:0)
在主视图文件中添加以下html代码。
<meta name="csrf-token" content="{{ csrf_token() }}">
始终在JS文件或视图文件上使用以下脚本。
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});