How to solve the page expired (419) error in Laravel?
![]()
To fix 419 page expired error in laravel, you have to use the CSRF token carefully in your project. below we have discussed cases when laravel show page expired error and their appropriate solution.
So, let’s start with what is CSRF token?
What is CSRF?
Cross-site request forgeries are a type of malicious exploit whereby unauthorized commands are performed on behalf of an authenticated user. Thankfully, Laravel makes it easy to protect your application from cross-site request forgery (CSRF) attacks. — Laravel
Table of content
- Page expired 419 error on Form
- Page expired 419 error on Ajax
- Remove CSRF protection on specific URL
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.
- In your head tag
- In Your Script tag
Condition 3
Note: disable CSRF protection use only for webhooks
disable CSRF protection field for routes group or specific routes
open file VerifyCsrfToken.php on your project
Please Subscribe US
Every week, on Tuesday, you will receive a list of free tutorials I made during the week (I write one every day) and news on other training products I create.
It’s motivate us to work.
Sometimes caching issues also the reason for the (419) page expired issue to clear your application cache to follow the below article.
Laravel по-русски
Русское сообщество разработки на PHP-фреймворке Laravel.
- Темы: Активные | Без ответов
Страницы 1
#1 09.07.2019 16:07:58
Ошибка 419 при любых настройках сессии и формы
Всем привет.
Проблема такая
У меня при отправке формы ошибка 419 page expired.
Перелопатив всё, что нашел в гугле, я пробовал делать следующее:
Проставлять права на запись в папке storage (файлы создаются при каждом обновлении страницы новые)
Переключился на хранение в БД (новые строки создаются)
Прописывал в форме так: @csrf
чистил кэши, пересобирал проект после удаления папки "vendor"
Ничего из этого не помогло. Единственным выходом было отрубить эту проверку csrf токена.
Сайт вертится на open server. Laravel 5.8 самая свежая.
Повторюсь, что всё работает, если вырубить проверку токена. МОжет надо что-то с сервером делать?
Код роута:
Как исправить ошибку Fix 419 Page Expired/CSRF token mismatch
Использование CSRF-токенов добавляет дополнительный уровень безопасности, подтверждая, что запрос исходит от того же приложения, а не от вредоносного источника. Laravel обеспечивает встроенную защиту от CSRF-атак путём генерации и проверки CSRF-токенов. Однако его неправильное использование может привести к ошибке: 419 Page Expired .
Чтобы устранить ошибку 419 Page Expired , необходимо убедиться, что CSRF-токен включён в отправляемую форму, добавив @csrf после между открывающим и закрывающим тегами <form> . При этом в форму будет автоматически добавлено скрытое поле input , содержащее CSRF-токен.
Вот пример того, как будет выглядеть обновлённая форма с использованием @csrf :
В качестве альтернативы вы можете использовать csrf_field() в <form> , которая выглядит следующим образом:
Обратите внимание, что ошибка 419 Page Expired может возникнуть и при наличии токена. Обычно это означает, что пользователь был неактивен в течение определённого времени и срок действия токена истёк. Это можно исправить, просто обновив страницу и отправив форму заново.
В примерах кода выше мы узнали, как применить токен к обычной форме. Читайте дальше, чтобы узнать, как добавить CSRF-токен в запросы Ajax POST с помощью jQuery или Axios. Мы также узнаем, как отключить проверку CSRF-токена для определённого маршрута или всего приложения. Наконец, мы ответим на некоторые часто задаваемые вопросы о том, почему GET-запрос не требует CSRF верификации и почему API вообще не требуют её.
Как исправить 419 (unknown status) с помощью Ajax POST (jQuery)
При отправке формы с помощью AJAX из jQuery вы можете получить ответ об ошибке — 419 (unknown status) .
Используя Laravel/jQuery, вы можете исправить ошибку 419 (unknown status) , добавив вызов csrf_token() в раздел <head> и вызвав $.ajaxSetup , для настройки jQuery на добавление токена в заголовки всех последующих POST-запросов.
Выполните следующие шаги, чтобы применить это исправление к вашему коду:
Добавьте CSRF-токен в раздел <head> :
Добавьте вызов $.ajaxSetup :
Добавьте код jQuery для отправки POST-запроса:
Полный пример (маршрут и вид):
routes/web.php:
/resources/views/form-jquery-ajax.blade.php:
Использование Axios для отправки Ajax POST (нет необходимости устанавливать CSRF-токен)
Axios — это HTTP-клиент для JavaScript. Он значительно упрощает отправку AJAX POST-запросов. Он делает это, устраняя необходимость включать jQuery, устанавливать токен или вызывать функцию настройки. Я рекомендую использовать Axios в любом проекте, который отправляет Ajax-запросы из JavaScript.
По умолчанию Laravel поставляется с Axios и Vite. Для того чтобы использовать Axios, нам просто нужно выполнить следующие команды:
Эти команды установили Axios и создали правильный .js файл в папке /public .
Теперь вы можете включить app.js и использовать Axios в своём коде для отправки POST-запроса, как показано в этом примере:
/resources/views/form-axios-ajax.blade.php:
Как отключить проверку CSRF-токенов в Laravel
Чтобы отключить проверку токена CSRF для всех маршрутов в Laravel, вы можете удалить промежуточное программное обеспечение CSRF, выполнив следующие шаги:
Откройте файл app/Http/Kernel.php в вашем проекте Laravel.
Найдите свойство $middleware в классе Kernel .
Найдите middleware класс VerifyCsrfToken , который обычно указывается как \App\Http\Middleware\VerifyCsrfToken::class .
Удалите или закомментируйте строку, содержащую middleware класс VerifyCsrfToken .
app/Http/Kernel.php:
Сохраните изменения в файле Kernel.php .
Удалив middleware VerifyCsrfToken , проверка маркера CSRF будет отключена для всех маршрутов в вашем приложении Laravel. Однако помните, что этот подход устраняет важную меру безопасности, поэтому используйте его с осторожностью и только в конкретных случаях, когда защита CSRF не требуется.
Как отключить CSRF-токен только для определённого маршрута
Чтобы отключить проверку CSRF-токена для определённого маршрута в Laravel, вы можете исключить маршрут из защиты CSRF, изменив middleware CSRF. Вот как это можно сделать:
Откройте файл app/Http/Middleware/VerifyCsrfToken.php в вашем проекте Laravel.
В классе VerifyCsrfToken найдите свойство except . Это свойство определяет URI, которые должны быть исключены из проверки CSRF-токенов.
Добавьте URI маршрута, который вы хотите исключить из защиты CSRF, в массив except . Например, если вы хотите исключить маршрут /example из проверки CSRF, добавьте следующую строку в массив except :
app/Http/Middleware/VerifyCsrfToken.php:
Если вам нужно исключить несколько маршрутов, вы можете добавить их в массив через запятую.
Сохраните изменения в файле VerifyCsrfToken.php .
Существуют обоснованные случаи использования отключения VerifyCsrfToken для определённых маршрутов. Например, чтобы наше приложение могло получать обратные вызовы от сторонних систем, например, от поставщика платежей. Обычно это используется для обновления статуса заказа до оплаченного.
Добавив конкретный маршрут в массив except в middleware VerifyCsrfToken , Laravel обойдёт проверку CSRF-токена для этого маршрута. Важно отметить, что хотя этот подход может быть полезен в определённых сценариях, отключение CSRF защиты должно выполняться осторожно и только в случае необходимости для обеспечения безопасности вашего приложения.
Почему маршруты API Laravel не используют проверку CSRF-токена
Стоит отметить, что в Laravel middleware для проверки CSRF-токенов намеренно не добавляется автоматически в маршруты API.
Маршруты API Laravel не используют проверку CSRF (Cross-Site Request Forgery) по умолчанию из-за своей stateless природы. API обычно работают в режиме stateless, то есть они не хранят данные сессии и не поддерживают состояние клиента между запросами.
Вместо этого API используют механизмы аутентификации на основе токенов, такие, как JWT (JSON Web Tokens) или OAuth для аутентификации и авторизации запросов. Такая аутентификация на основе токенов обеспечивает безопасный механизм без необходимости использования CSRF-токенов. Однако для традиционных веб-форм защита от CSRF остаётся крайне важной.
Почему к GET-запросам Laravel не применяется проверка CSRF-токена
CSRF-токен требуется в любых запросах POST , PUT , PATCH или DELETE , которые отправляются с веб-сайта. Но почему он не требуется, когда мы отправляем GET-запрос?
GET-запросы обычно используются для получения данных и считаются безопасными, поскольку они не должны изменять данные на стороне сервера. Поскольку CSRF атаки основаны на несанкционированных модификациях, применение CSRF-токенов к GET-запросам не требуется.
Для полноты картины стоит упомянуть, что запросы OPTIONS и HEAD также считаются запросами только для чтения, которые, как и GET-запросы, не требуют проверки CSRF-токена. Как показывает официальный код VerifyCsrfToken Middleware:
VerifyCsrfToken.php:
Заключение
В этой статье рассматривалось, как устранить ошибки 419 Page Expired и CSRF token mismatch в Laravel при использовании обычных форм или Ajax-запросов POST, отправленных с помощью jQuery или Axios.
Кроме того, в статье было показано, как можно отключить проверку CSRF-токена для определённого маршрута и как её можно отключить полностью. Наконец, мы также объяснили, почему маршруты API не используют проверку CSRF-токена по умолчанию и почему GET-запросы в Laravel не проверяют токен CSRF.
419 page expired error in Laravel
419 page expired Laravel error occurs when the valid CSRF token missing in the post request or when the page takes too long to send the post request which leads to expiring the CSRF token.
CSRF or Cross-Site Request Forgery is a type of malicious exploit whereby unauthorized commands are performed on behalf of an authenticated user. Laravel Framework has an internal mechanism for CSRF protection that is enabled by default for all POST, PUT, PATCH, and DELETE requests within web routes. A CSRF Token is a secret value generated by the server and checked in the subsequent HTTP POST, PUT, PATCH, and DELETE requests made by the client.
To solve 419 page expired error in Laravel, we have to use the CSRF token in our post requests. Here is an example showing how to use the CSRF token in a form to make a POST request.
The blade template has a built-in directive @csrf that will generate a hidden HTML input containing the token. The @csrf directive should be added inside the <form> tag. @csrf is equivalent to:
For an Ajax request, the solution is a little different. We are adding a CSRF token in the header of the Ajax requests. For this first, we add csrf_token in the meta tag as given below example.
Then we took the token from the meta tag and added it to the header of the Ajax request.
Disabling CSRF Protection for some routes
The App\Http\Middleware\VerifyCsrfToken middleware was included in the web middleware group by default. So this middleware will automatically check all POST requests in web routes and verify that the token in the request matches the token stored in the session. When these two tokens match, we know that the request was initiated by an authenticated user.
In some cases, we may want to exclude a set of routes from CSRF protection. For example, if we are working with Stripe for payments and we may be utilizing their webhook system. In this scenario, we will need to exclude the Stripe routes from CSRF protection.
We can disable CSRF protection for route groups or specific routes in Laravel. For this open App\Http\Middleware\VerifyCsrfToken middleware. In the VerifyCsrfToken.php file, we can add route groups or specific routes in an array to be excluded from CSRF protection in the $except array variable.
Conclusion
CSRF protection is enabled by default for all POST requests within web routes in Laravel. We have to pass the CSRF Token generated by the server along with all post requests and it will be verified by VerifyCsrfToken middleware. The blade directive @csrf will generate a hidden HTML input containing the token inside the form.