【发布时间】:2015-03-12 09:18:15
【问题描述】:
我们在我们的网站上遇到了这个问题,我们从用户那里随机收到了 CSRF 错误。会话 cookie 和会话数据设置为 12 小时后过期,会话驱动程序设置为使用 Redis。经过我们的调查,我们终于成功模拟了异常情况,所以下面是场景:
用户使用 Chrome 浏览器打开网站上的两个不同页面,并设置了“打开上次关闭的标签页”设置。其中一个页面上有一个表单(例如登录),然后用户在某个时候退出浏览器。他在第二天重新打开了他的浏览器(12 小时过去了,因此会话 cookie 和会话数据已过期)Chrome 尝试重新加载所有打开的页面。它同时向服务器发送两个请求,而它们都没有会话 cookie。在服务器端,Laravel 为每个生成两个不同的会话 ID。 Chrome 接收它们并覆盖另一个会话 cookie 上的一个。一旦用户尝试提交表单(例如登录),它会生成 CSRF 错误,因为表单会话 cookie 被覆盖。
我们还有一些 AJAX 发布请求,由于这种情况,我们收到了失败的 CSRF 错误。
我想知道 Laravel 是否可以以安全的方式为两个请求生成相同的会话 ID。
有没有人知道如何解决这个问题?
P.S:我们使用 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',
);
【问题讨论】:
-
@astro 它只是删除了导致相同问题的最后一个会话。关于以安全方式生成相同会话 ID 的任何想法?
-
我想唯一的方法是扩展会话类并编写自己的? laravel.com/docs/4.2/extending#session
-
检查你是否无意中删除了.js中的cookie
标签: php session laravel laravel-4