Запит на публікацію в Laravel - Помилка - 419 На жаль, термін дії вашої сесії / 419 закінчився


88

Я встановив Laravel 5.7

Додано форму до файлу \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

Додано до файлу \routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

Після відправки запиту POST:

419 Вибачте, ваш сеанс закінчився. Будь ласка, оновіть і спробуйте ще раз.

У версії 5.6такої проблеми не було.


Ви пробували додати переспрямування? Замість return;вас можна зателефонувати return redirect()->back();. З того, що я бачу, програма не може робити нічого після запиту на публікацію. Можливо, ви можете перенаправити його на подання після обробки запиту.
dcangulo

1
У мене така ж проблема. Коли я перейти на сесію бази даних , це відбувається , і коли я змінити назад fileна SESSION_DRIVERв .envце працює відмінно. Чому сеанс на базі даних не працює.
Джунайд Кадір Шекханзай

Я скопіював ваш точний код у свіжу інсталяцію laravel 5.7. Це спрацювало. Є проблема в іншому місці.
Kyle Wardle

ця проблема через проблему маркера. Я намагався запустити такий же код, як цей, але помилок не було. Ви повинні надати більше інформації, як драйвер сеансу, відображення значення _token у формі. Крім того, ви можете налагодити себе у цьому файловому vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phpрядку 67, щоб знати чому
bangnokia

1
Я зрозумів, що використовував sessionsстіл з іншою метою. Після зміни назви цієї таблиці на більш artisan session:table
придатну

Відповіді:


114

Перш ніж читати нижче, переконайтеся, що у вас є @csrfабо {{ csrf_field() }}у формі, як

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

Повідомлення про помилку сеансу закінчилось або 419 сторінки закінчилось у larvel, оскільки десь не вдається перевірити маркер csrf, що означає, що App\Http\Middleware\VerifyCsrfToken::classпроміжне програмне забезпечення вже ввімкнено. У форму @csrfвже додано директиву про леза, що теж повинно бути добре.

Тоді інша область для перевірки - це сесія. Перевірка csrfмаркера безпосередньо пов’язана з вашим сеансом, тому ви можете перевірити, чи працює драйвер сеансу чи ні, наприклад, неправильно налаштований Redis може спричинити проблему.

Можливо, ви можете спробувати переключити драйвер сеансу / програмне забезпечення з вашого .envфайлу, підтримувані драйвери наведені нижче

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

  • file - сеанси зберігаються у сховищі / фреймворку / сеансах.
  • cookie - сеанси зберігаються в захищених, зашифрованих файлах cookie.
  • database - сеанси зберігаються в реляційній базі даних.
  • memcached/ redis- сеанси зберігаються в одному з цих швидких сховищ на основі кеш-пам’яті.
  • array - сеанси зберігаються в масиві PHP і не зберігатимуться.

Якщо ваша форма працює після перемикання драйвера сеансу, то з цим конкретним драйвером щось не так, спробуйте виправити помилку звідти.

Можливі схильні до помилок сценарії

  • Можливо, сеанси, засновані на файлах, можуть не працювати через проблеми з дозволами в /storageкаталозі (швидке гуглювання принесе вам рішення), також пам’ятайте, що встановлення 777 для каталогу ніколи не буде рішенням.

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

  • redis/memcached конфігурація неправильна або одночасно маніпулюється якимсь іншим фрагментом коду в системі.

Може бути гарною ідеєю виконати php artisan key:generateта сформувати новий ключ програми, який, у свою чергу, очистить дані сеансу.

Очистити кеш браузера ТВЕРДО , я виявив, що chrome і firefox є винуватцем більше, ніж я пам’ятаю.

Докладніше про те, чому ключі програми важливі


1
Іноді це просто те, що браузери, переважно Chrome, не вводять значення сеансу Set-Cookie, оскільки воно неправильне або нестандартне. Отже, Laravel не знайде жодного існуючого значення сеансу із запиту HTTP для порівняння з отриманим _tokenзначенням із ФОРМИ. Уникайте використання SESSION_DOMAIN=...з IP-адресами, які специфікації файлів cookie Chrome та HTTP вважають небезпечними.
KeitelDOG

У мене така сама проблема, але я не отримую помилку постійно. Це просто трапляється час від часу. Думаю, це означає, що з драйвером сеансу немає проблем, оскільки він працює 99% часу. Але я працюю в режимі реального часу і час від часу отримую скарги від клієнтів. Однак це дуже рідко. Я використовую драйвер сеансу файлів. Хтось знає, чому це трапляється в моєму випадку? Дякую
TheAngelM97

@ TheAngelM97 Ви можете легко відтворити цю помилку, перейшовши на сторінку входу або реєстрації. Не робіть нічого, можливо, більше 30 хвилин. Потім, коли ви натискаєте кнопку "Відправити", 419 Page Expiredвідображається. Для зручності використання, як ви можете сказати простому користувачеві, що щойно сталося, і як це вирішити?
Патрос

38

Це пов’язано з тим, що форма вимагає csrf. У версії 5.7 вони змінили його на @csrf

<form action="" method="post">
    @csrf
    ...

Референс: https://laravel.com/docs/5.7/csrf


6
Його форма включає маркер csrf. Не впевнений, редагував він це пізніше чи ні.
eResourcesInc

так, у його формі спочатку є csrfполе, я щойно заглянув в історію редагування
Декстер Бенгіл

13

випадок 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



9

Я використовую Laravel 5.7, у мене була та ж проблема, і тому, що маркер csrf не був у формі, тому додавання

@csrf

вирішено проблему


7

Спробуйте висловити свої зауваження \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 на сервер.


1
Серед тих способів, про які ви згадали, для мене працював лише коментар \ App \ Http \ Middleware \ VerifyCsrfToken :: class в \ app \ Http \ Kernel.php.
Лекс Софт,

1
Очистити кеш-пам’ять, Створити новий ключ програми + Видалити файли cookie
dobs

Ви ніколи не будете коментувати \ App \ Http \ Middleware \ VerifyCsrfToken :: class. Чому ви це робите? Створити власне слабке місце в додатку?
Владд

@dobs Дякуємо за додавання "+ Видалити файли cookie", оскільки я отримав помилку 419 навіть після того, як зробив усе можливе, і це спрацювало лише тоді, коли я очистив файли cookie браузера / спробував інкогніто.
Niraj Pandey

6

змінити свій файл @csrfу welcome.blade.php на<input type="hidden" name="_token" value="{{ csrf_token() }}">

так що ваш код такий:

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>

6

Це може бути проблемою з вашим сеансом. Погравши з цими налаштуваннями, я вирішив свою проблему. Для мене це виявилося останнім варіантом.

  • Якщо ви використовуєте "файл" як драйвер сеансу, перегляньте сховище / фреймворк / сеанси, якщо сеанси зберігаються після оновлення. Якщо ні, то, швидше за все, через неправильні дозволи на папки. Переконайтеся, що ваш сховище / папка мають правильне право
  • Спробуйте відключити весь 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),

Джерело: Laravel Session завжди змінює кожне оновлення / запит у Laravel 5.4


Так, спробувавши багато інших речей, SESSION_SECURE_COOKIEперемикач (змінив його на false) зробив це за мене. (далі localhost:8000)
Marten Koetsier

Для мене також була проблема SESSION_SECURE_COOKIE, я її змінив, дотримуючись посібника з оптимізації веб-сайтів.
Брем Янссен,

для мене це працює з https, але не з http ... будь-яка ідея чому? дякую за чудову відповідь, мені знадобилися години, щоб її знайти.
sharkyenergy


4

Щоб вирішити цю помилку, спочатку потрібно вставити одну з наступних команд у тег форми.

@csrf АБО {{ csrf_field }}

Якщо вашу проблему не вирішено, виконайте наступне: (Зверніть увагу, що одна з наведених команд повинна бути в тезі форми)

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

Сподіваюся, ваша проблема вирішена


3

Через стільки часу я вирішив це таким чином

Мій шлях встановлення laravel був не таким, як встановлений у файлі конфігурації session.php

'domain' => env('SESSION_DOMAIN', 'example.com'),

2

Це може бути надмірно, але ви можете спробувати це:

// Виклик форми з іменем маршруту із доданим прихованим полем маркера.

<form method="POST" action="{{ route('foo') }}" >
    @csrf
    <input type="hidden" name="_token" value="{!! csrf_token() !!}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

// Іменований маршрут

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// Додаємо це в <head></head>блок:

<meta name="_token" content="{!! csrf_token() !!}" />

Я протестував його на своєму локальному комп'ютері за допомогою Homestead на Laravel 5.7, яка була свіжою установкою за допомогою Laravel Installer 2.0.1, і це спрацювало. Яке ваше оточення?

Теорія: Цікаво, чи пов’язано це з рендерінгом html-тегів із {{ }}блейдом у порівнянні {!! !!}з вашим середовищем або як ви його обслуговуєте (наприклад, php artisan serve). Що змушує мене думати , що це line 335з /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpповинен зробити те ж рядок набраний вручну вище.


Так круто, але <meta>мітки слід розміщувати всередині <head>, а не всередині <body>. Я не впевнений, що це сподобається валідатору HTML.
emix

Я б сказав, що ви праві, і це слід перенести на голову.
jeremykeny

2

У коді немає проблем. Я перевірив той самий код, що і ви написали під час нової інсталяції.

Код форми:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php код файлу:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

Результатом після подання форми є: Вихідні дані після подання форми

Якщо ви очистите кеш браузера або спробуєте з іншим браузером, я думаю, це буде виправлено.


2

Швидкий поганий підхід полягає в тому, що перейдіть до app \ http \ middleware \ verifycsrftoken.php і додайте маршрут у $, крім списку. Запит на публікацію буде проігноровано для перевірки токена CSRF.

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];

2

419 | сторінка це означає помилку Laravel питання безпеки , це означає поле маркера CSRF використовується неправильно.

використовуйте, {{csrf_field}} і ваша проблема буде вирішена.


2

Це має спрацювати, якщо ви спробуєте всі ці кроки:

  1. Переконайтеся, що ваш сеанс добре налаштований, найпростіший спосіб зробити його файлом і переконатися, що папка зберігання має дозвіл chmod 755, тоді у вашому .envналаштуванні, як показано нижче, найпростіший спосіб встановити драйвер файлової сесії.

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. Переконайтеся, що папка Cache очищена та доступна для запису, ви можете зробити це, запустивши нижче команди artisan.

    php artisan cache:clear
    
  3. Переконайтеся, що дозволи для папок добре встановлені, їх слід налаштувати, як показано нижче:

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. Переконайтеся, що у вашу форму @csrfвключено маркер.

Сподіваюся, це вирішить вашу проблему.


1

У вашому Http/Kernel.php

спробуйте прокоментувати цей рядок:

\Illuminate\Session\Middleware\AuthenticateSession::class,

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

це може бути коренем вашої проблеми


1

За замовчуванням у мене не було цієї проблеми. Тож я зробив chmod -R 644 sessions копію проблеми.

введіть тут опис зображення

Згодом я дав дозволи на папку сеансів chmod -R 755 sessions

тепер мій код проекту працює знову.

введіть тут опис зображення

Причиною цього є те, що ви зберігаєте кеш у файлі з відсутністю дозволів на запис.

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

Рішення:

1 - Як я вже визначив вище, ви можете надати 755 дозволів папці сеансів. 2 - Ви можете використовувати іншу конфігурацію драйвера сеансу.

файл - сеанси зберігаються у сховищі / фреймворк / сеанси. cookie - сеанси зберігаються в захищених, зашифрованих файлах cookie. база даних - сеанси зберігаються в реляційній базі даних. memcached / redis - сеанси зберігаються в одному з цих швидких сховищ на основі кеш-пам’яті. масив - сеанси зберігаються у масиві PHP і не зберігатимуться.

Мати на увазі; Якщо ви хочете використовувати memcached / redis, вам потрібно встановити їх на вашому сервері, або ваш контейнер redis докера повинен бути запущений.


1

Насправді CSRF - це маркер на основі сеансу. Додайте свій маршрут до групи маршрутів та додайте проміжне програмне забезпечення, яке контролює сеанси.

web є проміжним програмним забезпеченням за замовчуванням у laravel, і він може контролювати запити на сеанс.

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});

1

Якщо у вас вже є директива csrf , можливо, ви змінили спосіб запуску сеансів.

В config/session.php, перевірте «безпечний» поле. Це має бути значення false, якщо https недоступний на вашому сервері.

Ви також можете розмістити SESSION_SECURE_COOKIE=FALSEсвій .envфайл (кореневий каталог).


1

відкрити командний рядок cmd для вашого проекту.

1.команда

php artisan config:cache

2.команда

php artisan route:clear

1

Чи є у вас також csrf у заголовку вашої програми?

<meta name="csrf-token" content="{{ csrf_token() }}">

1

Хоча форма є @csrf, вона все ще відображається419 pages has expired

Я вирішив це після SESSION_SECURE_COOKIEопції оновлення до false у config / session.php

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

ніж очистити кеш


1

Перейдіть до config / session.php

знайти рядок

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

змінити його на false

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

Якщо для цього параметра встановлено значення TRUE, браузер вимагатиме використання протоколу HTTPS, інакше сесія не зберігатиметься. Оскільки він не дійсний


1

Я просто пройшов це і завів курсор тут для відповіді .. У моєму випадку рішення було очистити історію браузера.



0

У мене просто була така сама проблема, і все було до того, що я був абсолютно дурним. Я відключив усі поля форми (а не лише кнопку "Надіслати") за допомогою javascript перед подачею зазначеної форми! Звичайно, це призвело до того, що всі елементи форми не були подані (включаючи приховане _tokenполе), що, в свою чергу, призвело до помилки 419!

Сподіваюся, це допоможе комусь від кількох годин голови, що чухається!

Відключені введення форми не відображаються в запиті


0

Я давно отримав це питання. Я згадав, це викликає дозвіл storage/framework/sessions. Можливо, ви захочете змінити його за chmod -R 0777 storage/framework/sessionsкомандою. У мене це спрацювало.


0

У моєму випадку це дуже смішно. Я отримую помилку 419, коли розміщую Auth::routes()вгорі файл маршруту.

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

І я виправив помилку, перемістившись Auth::routes();внизу файлу маршруту.

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

Auth::routes();

Можливо, це може допомогти і вашій справі. Удачі.


0

Зверніть увагу, що ви отримуєте помилку 419, якщо ви намагаєтесь завантажити великий файл, який перевищує обмежений розмір файлу повідомлення. У цьому випадку ви можете збільшити upload_max_filesize і post_max_size до розумної суми (наприклад, 10 мільйонів або 20 мільйонів залежить від вашого варіанту використання та ресурсів), перевірте тут: https://stackoverflow.com/a/2184541/2100489

Але це може спричинити проблеми із споживанням ресурсів, наприклад, пропускна здатність та пам'ять. Як рішення ви можете перевірити розмір файлу перед подачею форми та показати попереджувальне повідомлення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.