419 page expired что за ошибка

от admin

How to solve page expired error in laravel for webhooks, ajax, and form

This article will help you to laravel 419 page expired error on your project, 419 pages expired mainly we got when we submit a form or call ajax without CSRF token and this article explains to put CSRF token on your form, and ajax call.

Let’s start today’s topic How to solve page expired error in laravel

Table of content

  1. Page expired 419 error on Form
  2. Page expired 419 error on Ajax
  3. Remove CSRF protection on specific URL

Article based on, How to solve page expired ( 419 ) error in laravel.

Many times we got the “Page Expired” ( Error code 419 ) error in Laravel using callback API (webhooks), ajax, and form.

Condition 1#

If you are getting an error after submitting the form then you need to add the CSRF field in your form.

Condition 2#

If you are getting an error after calling the AJAX then you need to add a header like below.

Отправить запрос в Laravel — Ошибка — 419 Извините, ваша сессия / 419 ваша страница истекла

419 Извините, срок вашей сессии истек. Обновите страницу и попробуйте еще раз.

В версии 5.6 такой проблемы не было.

40 ответов

случай 1: если вы запускаете проект в своей локальной системе, например 127.0.01: 8000,

Добавьте SESSION_DOMAIN= в свой файл .env

Или в вашем config / session.php ‘domain’ => env(‘SESSION_DOMAIN’, »),

А затем запустите php artisan cache:clear

случай 2: если проект запущен на сервере и у вас есть домен вроде «mydomain.com»

Добавьте SESSION_DOMAIN=mydomain.com в ваш файл .env

Или в вашем config / session.php ‘domain’ => env(‘SESSION_DOMAIN’, ‘mydomain.com’),

А затем запустите php artisan cache:clear

Чтобы решить эту ошибку, вам сначала нужно вставить одну из следующих команд в тег формы.

Если ваша проблема не решена, сделайте следующее: (Обратите внимание, что одна из вышеперечисленных команд должна быть в теге формы)

1.Вставьте одну из следующих команд в тег формы @csrf ИЛИ << csrf_field >>

2. Откройте файл .env и измените значения на «файл» в разделе SESSION_DRIVER.

3. Затем вам следует сбросить кеш laravel. введите ниже команды в терминале

php artisan view:clear php artisan route:clear php artisan cache:clear

php artisan config:cache

4. На последнем этапе отключите проект от сервера и снова нажмите на php artisan serve.

Надеюсь твоя проблема решена

Это может показаться излишним, но вы можете попробовать следующее:

// Форма вызывает названный маршрут с добавленным полем скрытого токена.

// Именованный маршрут

// Добавьте это в блок <head></head> :

Я тестировал его на своем локальном компьютере, используя Homestead на Laravel 5.7, который был свежей установкой с использованием Laravel Installer 2.0.1, и он работал. Какая у вас среда?

Теория: мне интересно, связано ли это с рендерингом HTML-тегов лезвиями с << >> по сравнению с в вашей среде или с тем, как вы ее обслуживаете (например, php artisan serve ). Что заставляет меня думать, что line 335 из /vendor/laravel/framework/src/illuminate/Foundation/helpers.php должен отображать ту же строку, введенную вручную выше.

Я попробовал все ответы, представленные здесь. Однако ни один из них не работал у меня на виртуальном хостинге. Однако упомянутая здесь душа работает для меня Как решить «несоответствие токена CSRF» в Laravel l

У меня была точно такая же проблема, и я был совершенно глуп. Я отключил все поля формы (а не только кнопку отправки) через javascript перед отправкой указанной формы! Это, конечно, привело к тому, что все элементы формы не были отправлены (включая скрытое поле _token ), что, в свою очередь, привело к ошибке 419!

Надеюсь, это поможет кому-то от нескольких часов чесания головы!

Для меня ошибка возникает, когда сеанс становится недействительным, и пользователь пытается отправить почтовый запрос. Csrf_token больше не действительны. поэтому я преодолеваю это, изменяя Handler.php в каталоге исключений и пытаюсь поймать исключение несоответствия токена, подобное этому.

Функция рендеринга была такой

Затем я модифицирую его, чтобы он выглядел так

Просто вы выбираете маршрут, который может обрабатывать операцию обновления токена.

Это потому, что для формы требуется csrf. В версии 5.7 поменяли на @csrf

Как насчет использования

Ошибка 419 в основном связана с проблемами с токеном csrf.

Я использую Laravel 5.7, у меня была такая же проблема, потому что токен csrf не был в форме, поэтому добавление

Это может быть проблема с вашей сессией. Поигравшись с этими настройками, я решил свою проблему. Для меня это оказался последний вариант.

  • Если вы используете «файл» в качестве драйвера сеанса, посмотрите хранилище / фреймворк / сеансы, если сеансы сохраняются после обновления. Если нет. Скорее всего, это связано с неправильными правами доступа к папке. Убедитесь, что ваше хранилище / папка имеет правильные права
  • Попробуйте отключить весь Javascript на своих страницах (отключив его через навигатор или внутри кода) и убедитесь, что ‘http_only’ => true,
  • Попробуйте использовать с https и без него
  • Убедитесь, что переменная SESSION_DRIVER НЕ равна нулю
  • Попробуйте переключиться между ‘encrypt’ => false и ‘encrypt’ => true,
  • Попробуйте изменить имя файла cookie ‘cookie’ => ‘laravelsession’,
  • Попробуйте либо установить для вашего SESSION_DOMAIN ваш фактический домен, либо null
  • Попробуйте переключиться между ‘secure’ => env (‘SESSION_SECURE_COOKIE’, false) и ‘secure’ => env (‘SESSION_SECURE_COOKIE’, true),

Попробуйте закомментировать \App\Http\Middleware\EncryptCookies::class в \app\Http\Kernel.php У меня похожая проблема, и я решил ее. Наверное, не лучшее решение из-за безопасности, но, по крайней мере, оно работало.

Раньше я пробовал:

  • Очистить кэш
  • Создать новый ключ приложения
  • Запустить мое приложение в различных браузерах (Chrome 70, Mozilla Firefox 57 и IE 11)
  • Запустить мое приложение на другом компьютере
  • Закомментировать \App\Http\Middleware\VerifyCsrfToken::class в \app\Http\Kernel.php
  • Закомментировать \Illuminate\Session\Middleware\AuthenticateSession::class в \app\Http\Kernel.php
  • Обновите и понизьте версию Laravel (между 5.6 и 5.7)

Но ничего из вышеперечисленного у меня не сработало.

ИЗМЕНИТЬ

В моем случае каждый раз, когда я вхожу в систему, создается новый файл сеанса (старый файл все еще сохраняется, но внезапно забывается. Проверьте storage/framework/sessions ) и генерируется новый токен CSRF. Так что проблема не в VerifyCsrfToken.

Как @Vladd упомянул в разделе комментариев, вам никогда не следует комментировать \App\Http\Middleware\VerifyCsrfToken::class . Вы должны убедиться, что отправили правильный CSRF TOKEN на сервер.

419 | page эта ошибка означает проблему безопасности laravel, она означает, что поле токена csrf используется неправильно.

Использовать <> и ваш вопрос будет решен.

Измените свой @csrf в welcome.blade.php на <input type=»hidden» name=»_token» value=»<< csrf_token() >>»>

Так что ваш код такой:

В коде нет проблем. Я проверил тот же код, что и вы, при новой установке.

Код файла web.php :

Результат после отправки формы:

Если вы очистите кеш браузера или попытаетесь использовать другой браузер, я думаю, это будет исправлено.

Быстрый плохой подход — перейти в app \ http \ middleware \ verifycsrftoken.php и добавить маршрут в список $ except. Почтовый запрос будет проигнорирован для проверки токена CSRF.

Спустя столько времени я решил это таким образом

Мой путь установки laravel не совпадал с указанным в файле конфигурации session.php

Добавьте токен csrf и ваша проблема будет решена. <> или @csrf

В моем случае отсутствовал ?> в конце routes / web.php.

Пожалуйста, также обновите CSRF в заголовке

Обновить CSRF в форме

Если у вас уже есть CSRF в заголовке и форме, то Перейдите к config/session.php и обновите

Хотя в форме есть @csrf , она все еще показывает 419 pages has expired

Я решил это после обновления опции SESSION_SECURE_COOKIE до false в config / session.php

Чем очистить кеш

2021, я столкнулся с этой ошибкой при применении всех вышеперечисленных решений, каждый мой маршрут выдавал 419. Мое приложение отлично работало на локальном хосте, но 419 на сервере. Затем я получил решение при исправлении файла .env на производстве, remove sanctum variables из .env и установил ‘secure’ => env(‘SESSION_SECURE_COOKIE’, null) в config/session.php

В вашем Http/Kernel.php

Попробуйте прокомментировать эту строку:

В вашем веб-массиве промежуточного программного обеспечения

Это может быть корнем вашей проблемы

По умолчанию у меня не было этой проблемы. Итак, я сделал chmod -R 644 sessions воспроизвести проблему.

Впоследствии я дал разрешения на папку сессий chmod -R 755 sessions

Теперь мой код проекта снова работает.

enter image description here

Причина, по которой это происходит, заключается в том, что вы храните кеш в файле с отсутствием разрешений на запись.

Файл конфигурации сеанса хранится в config / session.php. Обязательно ознакомьтесь с вариантами, доступными вам в этом файле. По умолчанию Laravel настроен на использование драйвера файлового сеанса, который хорошо работает для многих приложений. В производственных приложениях вы можете рассмотреть возможность использования драйверов memcached или redis для еще более высокой производительности сеанса.

1 — Как я исправил выше, вы можете дать 755 разрешений для папки сессий. 2 — Вы можете использовать другую конфигурацию драйвера сеанса.

file — сеансы хранятся в хранилище / framework / sessions. cookie — сеансы хранятся в безопасных зашифрованных файлах cookie. база данных — сеансы хранятся в реляционной базе данных. memcached / redis — сеансы хранятся в одном из этих быстрых хранилищ на основе кеша. array — сеансы хранятся в массиве PHP и не сохраняются.

Имей в виду; Если вы хотите использовать memcached / redis, вам необходимо, чтобы они были установлены на вашем сервере, или ваш контейнер docker redis должен быть запущен.

Читать:
Как включить secure boot на ноутбуке hp

Обратите внимание, что вы получаете ошибку 419, если пытаетесь загрузить большой файл, размер которого превышает ограничение на размер почтового файла. В этом случае вы можете увеличить как upload_max_filesize, так и post_max_size до разумной суммы (например, 10M или 20M в зависимости от вашего варианта использования и ресурсов), проверьте здесь: https://stackoverflow.com/a/2184541/2100489

Но это может вызвать проблемы с потреблением ресурсов, например с пропускной способностью и хранилищем. В качестве решения вы можете проверить размер файла перед отправкой формы и показать предупреждающее сообщение.

На самом деле CSRF — это токен на основе сеанса. Добавьте свой маршрут в группу маршрутов и добавьте промежуточное ПО, которое управляет сеансами.

Web — это промежуточное ПО по умолчанию в laravel, которое может управлять запросами сеанса.

В моем случае удаление bootstrap/cache устранило проблему

Перед чтением ниже убедитесь, что в вашей форме есть @csrf или << csrf_field() >> как

Сообщение об ошибке Session Expired или 419 Page Expired в Laravel появляется, потому что где-то происходит сбой проверки вашего токена csrf, что означает, что промежуточное ПО App\Http\Middleware\VerifyCsrfToken::class уже включено. В форму уже добавлена ​​блейд-директива @csrf , что тоже должно быть хорошо.

Затем другая область для проверки — это сеанс. Проверка токена csrf напрямую связана с вашим сеансом, поэтому вы можете проверить, работает ли ваш драйвер сеанса, например, неправильно настроенный Redis может вызвать проблему.

Возможно, вы можете попробовать переключить драйвер / программное обеспечение сеанса из файла .env , поддерживаемые драйверы приведены ниже

Поддерживаемые драйверы сеанса в Laravel 5, Laravel 6 и Laravel 7 (ссылка на документ)

  • file — сеансы хранятся в хранилище / framework / sessions.
  • cookie — сеансы хранятся в безопасных зашифрованных файлах cookie.
  • database — сеансы хранятся в реляционной базе данных.
  • memcached / redis — сеансы хранятся в одном из этих быстрых хранилищ на основе кеша.
  • array — сеансы хранятся в массиве PHP и не сохраняются.

Если ваша форма работает после переключения драйвера сеанса, значит, с этим конкретным драйвером что-то не так, попробуйте исправить ошибку оттуда.

Возможные сценарии с высокой вероятностью ошибок

Возможно, сеансы на основе файлов могут не работать из-за проблем с правами доступа к каталогу /storage (быстрый поиск в Google даст вам решение), также помните, что установка 777 для каталога никогда не является решением.

В случае с драйвером базы данных, ваше соединение с БД может быть неправильным, или таблица sessions может не существовать или неправильно настроена (неправильная часть конфигурации была подтверждена как проблема в соответствии с комментарием @Junaid Qadir).

Конфигурация redis/memcached неверна или одновременно обрабатывается другим фрагментом кода в системе.

Было бы неплохо выполнить php artisan key:generate и сгенерировать новый ключ приложения, который, в свою очередь, сбрасывает данные сеанса.

Очистить кеш браузера СЛОЖНО , я обнаружил, что виновниками являются Chrome и Firefox, больше, чем я могу вспомнить.

Solution for 419 Page Expired error in Laravel

The 419 Page Expired error is very common and easy to fix in Laravel applications. It’s caused by the internal framework mechanism called CSRF protection. CSRF stands for Cross-Site Request Forgery and is one of the most popular attacks.

An error page layout may differ between the framework versions, but the error code (419) and the error message (Page Expired) are the same. The following screenshot comes from Laravel 8.

To avoid this issue, every POST, PUT, PATCH, and DELETE request have to have a csrf token as a parameter. Depending on the way you send your request, you have several options to append this parameter.

Solution #1 – Blade directive

When you create a form in a Blade template, the solution is extremely simple. Blade template engine has a built-in directive @csrf that generates a hidden HTML input containing the token. The directive should be added just after opening <form> tag.

Alternatively, you can create a token input manually, using csrf_token() method. Outcome will be identical.

Solution #2 – Header of the Ajax request

As for Ajax request, the solution is a little different, but also quite simple. All you have to do is to add the csrf token to the head section of your HTML document and send it as an X-CSRF-TOKEN header with your request.

Solution #3 – Disabling CSRF validatation for some endpoints

For some specific endpoints, you can disable CSRF validation. Specific URLs can be excluded in the $except array of the VerifyCsrfToken class. This way you can exclude either the exact URL or group of URLs with a common prefix.

Excluding from CSRF protection should be used only for endpoints that are used by external applications (like payment providers). However, it’s also convenient to use api route file when you have many endpoints like that. They would be automatically excluded from the CSRF protection.

Conclusion

CSRF protection is by default enabled for all POST, PUT, PATCH, and DELETE requests within web routes file (those in api file are excluded). That approach has many advantages and allows developers to focus on more complex issues. However, that may be also confusing for less experienced programmers because requires more knowledge about a request lifecycle. Anyway, the three solutions I presented in this post are more than enough to handle all possible use cases and easily work with CSRF tokens in Laravel applications.

Post request in Laravel — Error — 419 Sorry, your session/ 419 your page has expired

419 Sorry, your session has expired. Please refresh and try again.

In version 5.6 there was no such a problem.

Shobi's user avatar

Thủ Thuật Máy Tính's user avatar

56 Answers 56

Before reading below make sure you have @csrf or << csrf_field() >> in your form like

The Session Expired or 419 Page Expired error message in Laravel comes up because somewhere your csrf token verification fails which means the App\Http\Middleware\VerifyCsrfToken::class middleware is already turned on. In the form the @csrf blade directive is already added, which should be fine as well.

Then the other area to check is the session. The csrf token verification is directly involved with your session, So you might want to check whether your session driver is working or not, such as an incorrectly configured Redis might cause an issue.

Maybe you can try switching your session driver/software from your .env file, the supported drivers are given below

Supported Session drivers in Laravel 5, Laravel 6 and Laravel 7 (Doc Link)

  • file — sessions are stored in storage/framework/sessions.
  • cookie — sessions are stored in secure, encrypted cookies.
  • database — sessions are stored in a relational database.
  • memcached / redis — sessions are stored in one of these fast, cache based stores.
  • array — sessions are stored in a PHP array and will not be persisted.

If your form works after switching the session driver, then something wrong is with that particular driver, try to fix the error from there.

Possible error-prone scenarios

Probably file-based sessions might not work because of the permission issues with the /storage directory (a quick googling will fetch you the solution), also remember putting 777 for the directory is never the solution.

In the case of the database driver, your DB connection might be wrong, or the sessions table might not exist or wrongly configured (the wrong configuration part was confirmed to be an issue as per the comment by @Junaid Qadir).

redis/memcached configuration is wrong or is being manipulated by some other piece of code in the system at the same time.

It might be a good idea to execute php artisan key:generate and generate a new app key which will, in turn, flush the session data.

Clear Browser Cache HARD, I found Chrome and Firefox being a culprit more than I can remember.

Похожие статьи