«Срок действия страницы истек из-за бездействия» - Laravel 5.5


111

На моей странице регистрации форма отображается правильно, и в ней {{ csrf_field() }}присутствует CsrfToken ( )).

Форма HTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

Я использую встроенную аутентификацию для пользователей. Не менял ничего кроме маршрутов и редиректов.

Когда я отправляю форму (также сразу после перезагрузки), она сообщает, что срок действия страницы истек из-за бездействия. Обновите страницу и попробуйте еще раз. ошибка.

Боже, я упускаю очень маленькую вещь. Но не уверен, что это такое. Любая помощь?

Обновить

Нашел проблему. Драйвер сеанса был установлен на массив. Изменил его на файл, и ошибка исчезла. Но что не так, если я использую массив?


Возможно, это связано с тем, что storage_path недоступен для записи. Здесь хранятся данные сеанса относительно токенов, если вы используете сеансы на основе файлов.
Девон

1
Нашел проблему. Драйвер сеанса был установлен на array. Изменил его на файл, и ошибка исчезла. Но что не так, если я использую массив?
Сугата Бозе

или эта проверка URL-
адреса

1
Для новой версии laravel используйте @csrf для решения проблемы.
Вуонг Тран,

Ответы:


164

Если вы приходите к этому ответу непосредственно из поиска , убедитесь, что вы уже добавили токен csrf в свою форму с {{ csrf_field() }}помощью OP.


Если у вас установлен драйвер сеанса в файл:

Возможно, это связано с тем, что storage_path недоступен для записи. Здесь хранятся данные сеанса относительно токенов, если вы используете сеансы на основе файлов. Это можно проверить с помощьюis_writable(config('session.files'))


Для OP драйвер сеанса был установлен в массив. Массив предназначен только для тестирования. Поскольку данные не сохраняются, он не сможет сравнить токен при следующем запросе.

Драйвер массива используется во время тестирования и предотвращает сохранение данных, хранящихся в сеансе.

https://laravel.com/docs/5.5/session#configuration


Проверьте config / session.php

Наконец, у меня возникла проблема: у нас был проект с доменом сеанса и безопасными настройками в config / session.php, но сайт разработки не использовал HTTPS (SSL / TLS). Это вызвало эту общую ошибку, поскольку по умолчанию для sessions.secure было установлено значение true.


3
Хорошо. Но пока он в разработке. Итак, если я использую массив, почему он давал мне эту ошибку?
Сугата Бозе

@SougataBose - это не разработка. Данные массива не сохраняются ...
Девон

Вот почему нужно правильно пройти через
DOC

Моя проблема не решена. Я действительно сделал основы. Но я использую кастомных провайдеров и сервисов. Нет проблем, когда я вызываю метод контроллера, но когда я запускаю сервисный метод в контроллере, который вызывается с помощью почтового запроса, проблема возникает!
Behnam Azimi

1
У меня была аналогичная проблема с сеансами, но в отношении тестирования. Оказалось, что когда я использовал Carbon::setTestNow($time);в тестах, я не очищал его, используя Carbon::setTestNow();потом.
riotCode 01

77

Я столкнулся с той же проблемой в Laravel 5.5. В моем случае это произошло после изменения маршрута с GET на POST. Проблема заключалась в том, что я забыл передать токен CSRF, когда переключился на POST.

Вы можете опубликовать токен CSRF в своей форме, позвонив:

 {{ csrf_field() }}

Или исключите свой маршрут в app / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];

2
csrf_field()присутствует в форме. Принятый ответ описывает проблему. Спасибо.
Сугата Бозе

1
В моем случае я получал POST от третьего лица, поэтому добавление csrf_field () не было вариантом. Поскольку в моем случае CSRF не был решающим фактором, добавление исключения к этому маршруту решило проблему. Спасибо.
Fábio Duque Silva

Моя проблема не решена. Я действительно сделал основы. Но я использую кастомных провайдеров и сервисов. Нет проблем, когда я вызываю метод контроллера, но когда я запускаю сервисный метод в контроллере, который вызывается с помощью почтового запроса, проблема возникает!
Behnam Azimi

1
Пожалуйста, не отключайте проверку CSRF! Очень важно иметь защиту. Узнайте, как правильно отправить токен и защитить пользователей, вошедших в систему, от вредоносного JavaScript, который может выполнять действия от их имени.
Девон



6

Мой случай был решен SESSION_DOMAIN, на моем локальном компьютере нужно было установить xxx.localhost. Это вызывало конфликты с продуктом SESSION_DOMAIN, xxx.comкоторый был установлен непосредственно в файле конфигурации session.php.


Какой драйвер сеанса вы использовали? fileили cookie?
KeitelDOG 05

4

Некоторая информация хранится в куки, которая связана с предыдущими версиями laravel в разработке. Таким образом, это противоречит токенам, сгенерированным csrf, которые генерируются другими версиями. Просто очистите файл cookie и попробуйте.


вы смогли увидеть <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">код в сгенерированном html?
Суреш Велусами

Это там. Нашел проблему. Драйвер сеанса был установлен на массив. Изменил его на файл, и ошибка исчезла.
Сугата Бозе

4

Для тех, у кого проблема осталась и ничего не помогло. Обратите внимание на параметр mbstring.func_overload в php.ini. Он должен быть установлен в 0. И mbstring.internal_encoding установить в UTF-8. В моем случае это было проблемой.


Большое спасибо! Ваш ответ спас мой мозг от краха)
Рустембек Калиев

3

Я меняю разрешение на хранилище и ошибка пропала. Казалось, проблема заключалась в отсутствии разрешения.

sudo chmod -R 775 storage/

2
Будьте осторожны при рекурсивном использовании таких открытых разрешений. Очень рекомендую против 775 для файлов. 755 для каталогов и 644 для файлов - это норма.
Девон

3

Добавить @csrf в форму и также перейдите на VerifyCsrfToken.php

приложение-> Http-> Middleware-> VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];

1

В моем случае сайт был в порядке на сервере, но не на локальном. Потом я вспомнил, что работал над безопасным сайтом.
Итак, в файле config.session.php установите для переменной secure значение false.

'secure' => env('SESSION_SECURE_COOKIE', false),

0

У меня было приложение с несколькими поддоменами, и проблема с файлом cookie была между ними. Очистка файлов cookie решила мою проблему.

Кроме того , попробуйте установить SESSION_DOMAINв .env файле. Используйте именно тот субдомен, который вы просматриваете.


0

Убедитесь, что на вашем веб-сервере установлено правильное системное время. В моем случае бродячая машина была в будущем (26 января 14:08:26 UTC 2226), поэтому, конечно, время в cookie сеанса моего браузера истекло около 200+ лет назад.



0

Я нашел два решения, чтобы избежать этой ошибки: 1) добавив protected $ except = ['/ yourroute'], возможно отключить проверку токена csrf из определенного корня. 2) просто прокомментируйте строку \ App \ Http \ Middleware \ VerifyCsrfToken :: class в группе защищенного промежуточного программного обеспечения в ядре


0

У меня была такая же проблема, но проблема не во фреймворке, а в браузере. Я не знаю почему, но в моем случае Google Chrome автоматически блокирует файлы cookie. После разрешенных файлов cookie проблема была решена.


0

Короткий ответ

Добавьте запись маршрута для registerвapp/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

и очистите кеш и маршрут кеша с помощью команд:

php artisan cache:clear && php artisan route:clear

подробности

Каждый раз, когда вы заходите на сайт Laravel, генерируется токен, даже если сеанс не был запущен. Затем в каждом запросе этот токен (хранящийся в файлах cookie) будет проверяться на соответствие сроку его действия, установленному в SESSION_LIFETIMEполе config/session.phpфайла.

Если вы оставите сайт открытым дольше, чем время истечения срока действия, и попытаетесь сделать запрос, этот токен будет оценен, и ошибка истечения срока действия вернется. Итак, чтобы пропустить эту проверку в формах, которые не входят в функции аутентифицированных пользователей (например, регистрация или вход), вы можете добавить маршрут except в app/Http/Middleware/VerifyCsrfToken.php.


1
Если эта страница обрабатывает вводимые пользователем данные, она должна пройти проверку CSRF .
Sougata Bose

@SougataBose В самом деле, в этом случае я думаю, что лучше всего использовать валидатор капчи в качестве Google reCAPTCHA
JC Gras

0

Много раз это происходит, потому что вы тестируете проект на заднем плане.


0

Решение:

используйте новую вкладку в режиме инкогнито, а затем проверьте ее снова.

причина:

в моем случае другой пользователь вошел в мою админ-панель

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.