«Срок действия страницы истек из-за бездействия» - 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, который может выполнять действия от их имени.
Девон
11

Попробуйте их все.

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Сагар Чамлинг
источник
Вместо того, чтобы пробовать все вышеперечисленные команды, используйте этот пакет. Github.com/afrazahmmad/clear-all-cached-data
Афраз Ахмад
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. В моем случае это было проблемой.

andrew_jackson
источник
Большое спасибо! Ваш ответ спас мой мозг от краха)
Рустембек Калиев
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+ лет назад.

mim.ms
источник
0

установить mbstring.func_overload = 2

это помогло мне

Toxi Gen
источник
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.

JC Gras
источник
1
Если эта страница обрабатывает вводимые пользователем данные, она должна пройти проверку CSRF .
Sougata Bose
@SougataBose В самом деле, в этом случае я думаю, что лучше всего использовать валидатор капчи в качестве Google reCAPTCHA
JC Gras
0

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

опарам
источник
0

Решение:

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

причина:

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

сабля tabatabaee yazdi
источник