У нас была эта проблема на нашем веб-сайте, что мы случайно получили ошибки CSRF от наших пользователей. У файлов cookie сеанса и данных сеанса было установлено, что срок действия истекает через 12 часов, а драйвер сеанса настроен на использование Redis. В дополнение к нашим исследованиям нам наконец удалось смоделировать условие исключения, так что вот сценарий:
Пользователь открывает две разные страницы на сайте, используя браузер Chrome с включенной настройкой "Открыть последние закрытые вкладки". На одной из страниц есть форма (например, логин), после чего пользователь в какой-то момент покидает браузер. Он снова открывает свой браузер на следующий день (прошло 12 часов, поэтому сеанс cookie и данные сеанса истек) Chrome пытается перезагрузить все открытые страницы. Он отправляет на сервер два одновременных запроса, в то время как ни один из них не имеет cookie сеанса. На конце сервера Laravel генерирует два разных идентификатора сеанса для каждого. Chrome получает их и переопределяет их в другом сеансовом cookie. Когда пользователь пытается отправить форму (например, логин), она генерирует ошибку CSRF, поскольку cookie сеанса формы переопределяется.
У нас также были некоторые сообщения AJAX, которые были вызваны ошибками CSRF из-за этого условия.
Мне было интересно, сможет ли Laravel генерировать один и тот же идентификатор сеанса для обоих запросов безопасным образом.
Есть ли у кого-нибудь идеи, как мы можем исправить эту проблему?
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',
);