419 page expired что за ошибка
Перейти к содержимому

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

  • автор:

Laravel выкидывает ошибку 419 у некоторых пользователей?

Добрый день, при авторизации у некоторых пользователей выкидывает 419, так же пробовал зайти через их акк у себя на пк, без проблем авторизовался, может ли быть дело в кэше?

  • Вопрос задан более года назад
  • 184 просмотра

1 комментарий

Простой 1 комментарий

delphinpro

Сергей delphinpro @delphinpro Куратор тега Laravel

419 Page expired

Чаще всего такая ошибка в ларке проявляется от протухания csrf токена.

Решения вопроса 0
Ответы на вопрос 2
помогло? отметь решением!

Дело в RateLimiter на неудачные попытки авторизации, в зависимости от версии laravel немного в разных местах настраивается, в 9 в app/Providers/FortifyServiceProvider.php

Ответ написан более года назад
marq @marq Автор вопроса
так он у меня даже не используется

marq, а что используется? в 8 и 9 под капотом любой авторизации frotify, раньше что-то другое, но смысл тот же

419 ошибка может возникать из-за устаревшего XSRF токена. Если пользователь открыл страницу авторизации и, например, только через полчаса решил авторизоваться, поймают такую ошибку. Перепроверьте, все ли в порядке с токенами (может в вашем алгоритме авторизации они не всегда отправляются корректно). На крайний случай, чтобы исключить эту причину, попробуйте временно отключить проверку на токен вообще.

Ответ написан более года назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

laravel

  • Laravel

Как в Laravel 10 с компонентом passport поместить в токен свою информацию?

  • 1 подписчик
  • 17 часов назад
  • 21 просмотр

Как исправить ошибку Page Expired 419 в Laravel

В этом уроке мы разрешим ошибки 419 страницы с истекшим сроком действия в Laravel. Много раз мы сталкивались с «Срок действия страницы истек из-за неактивности.

Причина проблемы

Эта проблема связана с csrf_token. Итак, ниже рассмотрим пример этой проверки ошибок и применим ее в соответствии с вашими требованиями.

При отправки формы

Если вы получаете сообщение об ошибке после отправки формы в laravel, вам нужно добавить поле CSRF в форму, как показано ниже.

 
@csrf .

После вызова AJAX

Если вы получаете сообщение об ошибке после вызова AJAX, вам нужно добавить заголовок, как показано ниже, в метатег.

И после этого вам нужно добавить приведенный ниже код в тег script.

$.ajaxSetup( < headers: < 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') >>);

В некоторых случаях также возникает проблема с кешем, поэтому нам нужно его очистить.

Читайте также:

Redis в Laravel: Установка и настройка

Redis в Laravel: Установка и настройка

TDD в Laravel с использованием phpunit для разработки REST Api

TDD в Laravel с использованием phpunit для разработки REST Api

Как исправить ошибку 419 Page Expired/CSRF token mismatch

Использование CSRF-токенов добавляет дополнительный уровень безопасности, подтверждая, что запрос исходит от того же приложения, а не от вредоносного источника. Laravel обеспечивает встроенную защиту от CSRF-атак путём генерации и проверки CSRF-токенов.

Использование CSRF-токенов добавляет дополнительный уровень безопасности, подтверждая, что запрос исходит от того же приложения, а не от вредоносного источника. Laravel обеспечивает встроенную защиту от CSRF-атак путём генерации и проверки CSRF-токенов. Однако его неправильное использование может привести к ошибке: 419 Page Expired .

Чтобы устранить ошибку 419 Page Expired , необходимо убедиться, что CSRF-токен включён в отправляемую форму, добавив @csrf после между открывающим и закрывающим тегами . При этом в форму будет автоматически добавлено скрытое поле input , содержащее CSRF-токен.

Вот пример того, как будет выглядеть обновлённая форма с использованием @csrf :

form method="POST" action="/your-route"> 
@csrf

form>

В качестве альтернативы вы можете использовать csrf_field() в , которая выглядит следующим образом:

form method="POST" action="/your-route"> 
>

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() в раздел и вызвав $.ajaxSetup , для настройки jQuery на добавление токена в заголовки всех последующих POST-запросов.

Выполните следующие шаги, чтобы применить это исправление к вашему коду:

    Добавьте CSRF-токен в раздел :

head> 
meta name="csrf-token" content=">">
head>
script> 
$.ajaxSetup(
headers:
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
>
>);
script>
script> 
// Отправляем сокращённый jQuery POST:
$.post('/formProcessor');

// Или отправьте обычный jQuery POST:
$.ajax(
type: "POST",
url: "/formProcessor"
>);
script>

Полный пример (маршрут и вид):

routes/web.php:

Route::get('/form', function ()  
return view('form');
>);

Route::post('/formProcessor', function ()
return response('', 200);
>);

/resources/views/form-jquery-ajax.blade.php:

DOCTYPE html> 
html lang="getLocale()) >>">
head>
meta charset="utf-8">
meta name="viewport" content="width=device-width, initial-scale=1">
title>jQuery Ajax POST Exampletitle>
meta name="csrf-token" content=">">
script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"> script>
head>
body>
button class="sendButton">Click mebutton>
script>
$.ajaxSetup(
headers:
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
>
>);
$('.sendButton').click(function()
$.post('/formProcessor');
>);
script>
body>
html>

Использование Axios для отправки Ajax POST (нет необходимости устанавливать CSRF-токен)

Axios — это HTTP-клиент для JavaScript. Он значительно упрощает отправку AJAX POST-запросов. Он делает это, устраняя необходимость включать jQuery, устанавливать токен или вызывать функцию настройки. Я рекомендую использовать Axios в любом проекте, который отправляет Ajax-запросы из JavaScript.

По умолчанию Laravel поставляется с Axios и Vite. Для того чтобы использовать Axios, нам просто нужно выполнить следующие команды:

npm install 
npm run build

Эти команды установили Axios и создали правильный .js файл в папке /public .

Теперь вы можете включить app.js и использовать Axios в своём коде для отправки POST-запроса, как показано в этом примере:

/resources/views/form-axios-ajax.blade.php:

DOCTYPE html> 
html lang="getLocale()) >>">
head>
meta charset="utf-8">
meta name="viewport" content="width=device-width, initial-scale=1">
title>jQuery Ajax POST Exampletitle>
@vite(['resources/js/app.js'])
head>
body>
button class="sendButton">Click mebutton>
script>
document.querySelector('.sendButton').addEventListener('click', function (event)
axios.post('/formProcessor',
// Полезная нагрузка запроса
data: 'your-data'
>).then(response =>
// Обработка ответа
alert('successful!');
>).catch(error =>
// Обработка ошибки
console.error(error);
>);
>);
script>
body>
html>

Как отключить проверку CSRF-токенов в Laravel

Чтобы отключить проверку токена CSRF для всех маршрутов в Laravel, вы можете удалить промежуточное программное обеспечение CSRF, выполнив следующие шаги:

  1. Откройте файл app/Http/Kernel.php в вашем проекте Laravel.
  2. Найдите свойство $middleware в классе Kernel .
  3. Найдите middleware класс VerifyCsrfToken , который обычно указывается как \App\Http\Middleware\VerifyCsrfToken::class .
  4. Удалите или закомментируйте строку, содержащую middleware класс VerifyCsrfToken . Например, измените: app/Http/Kernel.php:

\App\Http\Middleware\VerifyCsrfToken::class,
// \App\Http\Middleware\VerifyCsrfToken::class,

Удалив middleware VerifyCsrfToken , проверка маркера CSRF будет отключена для всех маршрутов в вашем приложении Laravel. Однако помните, что этот подход устраняет важную меру безопасности, поэтому используйте его с осторожностью и только в конкретных случаях, когда защита CSRF не требуется.

Как отключить CSRF-токен только для определённого маршрута

Чтобы отключить проверку CSRF-токена для определённого маршрута в Laravel, вы можете исключить маршрут из защиты CSRF, изменив middleware CSRF. Вот как это можно сделать:

  1. Откройте файл app/Http/Middleware/VerifyCsrfToken.php в вашем проекте Laravel.
  2. В классе VerifyCsrfToken найдите свойство except . Это свойство определяет URI, которые должны быть исключены из проверки CSRF-токенов.
  3. Добавьте URI маршрута, который вы хотите исключить из защиты CSRF, в массив except . Например, если вы хотите исключить маршрут /example из проверки CSRF, добавьте следующую строку в массив except : app/Http/Middleware/VerifyCsrfToken.php:

protected $except = [ 
'/example',
];

Существуют обоснованные случаи использования отключения 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:

protected function isReading($request) 

return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
>

Заключение

В этой статье рассматривалось, как устранить ошибки 419 Page Expired и CSRF token mismatch в Laravel при использовании обычных форм или Ajax-запросов POST, отправленных с помощью jQuery или Axios.

Кроме того, в статье было показано, как можно отключить проверку CSRF-токена для определённого маршрута и как её можно отключить полностью. Наконец, мы также объяснили, почему маршруты API не используют проверку CSRF-токена по умолчанию и почему GET-запросы в Laravel не проверяют токен CSRF.

Надеюсь, эта статья будет вам полезна. Счастливого кодинга!

Laravel 419 page expired при оплате через free kassa

Я встроил виджет free kassa на сайт. Когда происходит оплата, их сервер отправляет POST запрос на /payment/result . В логах free kassa написано, что была ошибка 419 page expired. Это из-за того ,что не передается csrf токен. Значит нужно добавить этот url в исключение. web.php

// web.php // Роут, на который free kassa шлёт запрос Route::post('/payment/result', function (Request $request)< \Illuminate\Support\Facades\Log::info($request->all()); return 123; >)->middleware(\App\Http\Middleware\FreeKassaVerifyCsrfToken::class); Route::any('/', function () < return view('index'); >)->where('any', '.*');

VerifyCsrfToken.php

Я создал middleware FreeKassaVerifyCsrfToken для обработки роутов free kassa, но при оплате по запросу /payment/result ошибка 419 page expired .

use Illuminate\ Foundation\ Http\ Middleware\ VerifyCsrfToken as Middleware; class FreeKassaVerifyCsrfToken extends Middleware < private $whiteList = [ '136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '136.243.38.108', '136.243.38.*', ]; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) < Log::info('123'); if (!in_array($request - >ip(), $this - > whiteList)) < abort(403); >return $next($request); > >

В лог файл тоже ничего не выводится, то есть handler даже не срабатывает. Но, если в web.php прицепить middleware FreeKassaVerifyCsrfToken к роуту / , то при любых запросах — 403 ошибка, и в лог выводится 123 В чём моя ошибка?

Отслеживать
задан 25 мая 2021 в 18:30
582 4 4 серебряных знака 19 19 бронзовых знаков

А зачем Вы вообще проверяете токен для этого роута? Просто блокируйте любой реквест, который пришёл не со списка разрешенных IP кассы.

25 мая 2021 в 19:09

Так вот же. я скинул VerifyCsrfToken.php, в котором я исключаю ip free kassa из csrf проверки. Но это не работает

25 мая 2021 в 19:10
@Vladimir Gonchar Может я что-то не так делаю?
25 мая 2021 в 19:15
Но при этом в web.php Вы его навешиваете, а затем исключаете. Зачем?
25 мая 2021 в 19:40

Не надо VerifyCsrfToken навешивать в вебе, а экспект работает по другому, он исключает те маршруты которые есть в вашем приложении, в експект отключаете проверку csrf токена своего маршрута, а в роутинге добавляете проверку на ip. Ну или как лучше так это сделать мидлварь которая проверяет апишки фрикассы

26 мая 2021 в 3:30

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Мидлварь VerifyCsrfToken исключает маршруты которые есть в внутри вашего приложения, метод except принимает значения урлов из роутинга с мидлварной группой web

Теперь о ваших черепахах. У вас есть пост запрос такого типа

// web.php Route::post('/payment/result', function(Request $request) all()); >); >); 

Вешаем его в исключения CSRF защиты

Делаем свою мидлварь для обработки уролов фри кассы с хандлером типа

/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * * @return mixed */ public function handle(Request $request, Closure $next) < if (!in_array($request->ip(), $this->whiteList)) < abort(403); >return $next($request); > 

P.S.: Пропа whiteList содержит массив разрешённых апишников для доступа к этому маршруту

Теперь далее: регистрируем созданную мидлварь для роута

// web.php Route::post('/payment/result', function(Request $request) < Illuminate\ Support\ Facades\ Log::info($request - >all()); >); >)->middleware(YourMiddleware::class); 

Если вкратце то как то так.

UPDATE:

Мидлварь VerifyCsrfToken цепляется через kernel который лежит в папке http на группу web по этому его не надо вручную добавлять к роутам, все роутый из файла web.php уже имеют эту группу на уровне роут провайдера

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *