Php 如何在Laravel中的Ajax调用期间可靠地防止令牌失配异常?
我知道以前有很多关于在Laravel中处理Ajax调用上的CSRF令牌的问题。Laravel文档将在任何Ajax请求上传递csrf_令牌值,如下所示:Php 如何在Laravel中的Ajax调用期间可靠地防止令牌失配异常?,php,ajax,laravel,laravel-5.2,Php,Ajax,Laravel,Laravel 5.2,我知道以前有很多关于在Laravel中处理Ajax调用上的CSRF令牌的问题。Laravel文档将在任何Ajax请求上传递csrf_令牌值,如下所示: $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); 这正是我在我的应用程序中所做的 然而,仍然有很多情况下,TokenMismatchException被抛出
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
这正是我在我的应用程序中所做的
然而,仍然有很多情况下,TokenMismatchException
被抛出并登录到服务器上。我认为其中一个原因是:
csrf令牌
值csrf令牌
值现在当然是错误的,因为Laravel会话不存在,需要重新生成
Laravel文档也使用XSRF-TOKEN
cookie。然而,cookie显然与laravel\u会话
cookie的过期日期相同,这对我也没有帮助
请注意,生成Ajax调用不一定要对用户进行身份验证,来宾用户可以触发这些调用,并且所有调用都会针对跨站点请求伪造进行检查
在上述情况下,是否有办法避免出现令牌失配异常?
旁注:
我描述的案例可能不是唯一的一个。在过去的24小时内,异常被抛出并记录了36次,我确信这些事件不能都与同一问题联系在一起,特别是因为这些是各种Ajax调用—GET和POST。尝试使用Ajax传递令牌的另一种方法:
$.ajax({
type: 'POST',
url: '/your/url',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
success: function (data) {
//do something
}
});
或者,您可以选择从CSRF保护中排除URI:
通常,您应该将这些类型的路由放置在RouteServiceProvider应用于routes/web.php文件中所有路由的web中间件组之外。但是,您也可以通过将路由的URI添加到VerifyCsrfToken中间件的$Exception属性来排除路由:
在添加ajax代码的页面中包括以下内容
<input type="hidden" id="token" name="_token" value="<?php echo csrf_token();?>" />
var token = $('#token').val();
$.ajax({
url: "your-url",
method: "POST",
data: {
_token : token,
required_fields: your-fields
},
success: function(result) {
if(result.success == true) {
// required action upon success
}
}
});
<input type="hidden" id="token" name="_token" value="<?php echo csrf_token();?>" />
var token = $('#token').val();
$.ajax({
url: "your-url",
method: "POST",
data: {
_token : token,
required_fields: your-fields
},
success: function(result) {
if(result.success == true) {
// required action upon success
}
}
});