我们的网站上有这个问题,我们从用户那里随机得到了CSRF错误。会话cookie和会话数据设置为在12小时后过期,会话驱动程序设置为使用Redis。根据我们的调查,我们最终成功地模拟了异常情况,所以这是一个场景:
用户使用Chrome浏览器打开了网站上的两个不同的页面,并设置了“打开上次关闭的标签”。其中一个页面上有一个表单(例如登录),然后用户在某个时候退出浏览器。他第二天重新打开浏览器(12小时过去了,会话cookie和会话数据都过期了) Chrome尝试重新加载所有打开的页面。它同时向服务器发送两个请求,而这些请求都没有会话cookie。在服务器端,Laravel为每个服务器生成两个不同的会话ID。Chrome接收它们并覆盖另一个会话cookie上的一个。一旦用户尝试提交表单(例如登录),它会生成CSRF错误,因为表单会话cookie被覆盖。
我们也有一些AJAX post请求,由于这种情况,我们得到了失败的CSRF错误。
我想知道Laravel是否可以以安全的方式为两个请求生成相同的会话ID。
有人知道我们如何解决这个问题吗?
附言:我们使用的是带有以下会话配置的laravel 4.1:
return array(
'driver' => 'redis',
'lifetime' => 720,
'expire_on_close' => false,
'files' => storage_path().'/sessions',
'connection' => null,
'table' => 'sessions',
'lottery' => array(2, 100),
'cookie' => 'laravel_session',
'path' => '/',
'domain' => '.ourdomain.com',
);
发布于 2016-05-18 02:40:41
这个问题我已经遇到过很多次了,没有特别的原因,Amir也没有提到。
清除域cookies适用于我所看到的场景。
发布于 2017-01-17 12:58:12
在我的例子中,这是缓存配置文件的问题。Laravel创建了一个配置文件,该文件缓存在bootstrap/cache文件夹中。将此config.php文件重命名为其他名称并运行"php artisan cache:clear“
然后运行这个站点,它应该可以正常工作
发布于 2019-06-26 08:51:40
这可能与这个众所周知的问题有关
Laravel 5.0 - Asyncronous AJAX Requests cause Session Variable Changes to be Overwritten #7549
如果多个请求试图覆盖会话,而会话文件没有锁,则可能导致会话文件损坏(被覆盖)。
https://stackoverflow.com/questions/27938723
复制相似问题