Опубликовать запрос в Laravel 5.7, laravel 5.8 --- Ошибка - 419 Извините, срок вашей сессии истек

Я установил 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 такой проблемы не было.

Ответы

Ответ 1

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

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

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

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

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

Поддерживаемые драйверы сессий в Laravel 5.7 (Doc Link)

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

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

Возможные сценарии ошибок

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

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

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

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

Очистить кэш браузера ТРУДНО, я обнаружил, хром и Firefox быть виновником больше, чем я могу вспомнить.

Узнайте больше о том, почему ключи приложения важны

Ответ 2

Это потому, что форма требует CSRF. В версии 5.7 они изменили его на @csrf

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

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

Ответ 3

вариант 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

Ответ 4

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

@csrf

исправил проблему

Ответ 5

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

{{ csrf_field() }} вместо @csrf

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

Ответ 6

Попробуйте закомментировать \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 на сервер.

Ответ 7

измените ваш @csrf в @csrf на <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>

Ответ 8

В вашем Http/Kernel.php

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

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

в вашем сетевом средстве

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

Ответ 9

добавьте токен csrf, и ваша проблема будет решена. {{}} Csrf_token или же @csrf

Ответ 10

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

Код формы:

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

web.php файла web.php:

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

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

Результат после отправки формы: Output after submitting the form

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

Ответ 11

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

enter image description here

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

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

enter image description here

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

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

Решения:

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

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

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

Ответ 12

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

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

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

Ответ 13

419 | Эта ошибка означает, что проблема безопасности laravel означает, что поле токена csrf используется неправильно. использовать {{csrf_field}} и ваша проблема будет решена.

Ответ 14

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

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

Отключенные входные данные формы не отображаются в запросе

Ответ 15

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

//Форма добавлена с именем named route со скрытым полем токена.

<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-меток с помощью {{ }} vs. {!! !!} {!! !!} в вашей среде или как вы ее обслуживаете (например, php artisan serve). Что заставляет меня думать, что line 335 из /vendor/laravel/framework/src/illuminate/Foundation/helpers.php должна отображать одну и ту же строку, напечатанную вручную выше.

Ответ 16

Вы не можете сделать пустой возврат на Laravel 5.6 или больше. Laravel всегда ожидает, что значение будет возвращено. (Я знаю из прошлого опыта). Это в основном связано с тем, как PHP 7 обрабатывает пустые возвращения.

Ответ 17

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

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

Ответ 18

На самом деле SCRF является токеном на основе сеанса. Добавьте свой маршрут в группу маршрутов и добавьте промежуточное программное обеспечение, которое контролирует сеансы.

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

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

Ответ 19

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

Ответ 20

Я получил эту проблему давным-давно. Я вспомнил, что это вызывает разрешение storage/framework/sessions. Вы можете изменить его с помощью команды chmod -R 0777 storage/framework/sessions. Это сработало для меня.

Ответ 21

Исключение URI из защиты CSRF

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

Обычно такие типы маршрутов следует размещать за пределами группы веб-промежуточного программного обеспечения, которую RouteServiceProvider применяет ко всем маршрутам в файле route/web.php. Однако вы также можете исключить маршруты, добавив их URI к свойству $ кроме промежуточного программного обеспечения VerifyCsrfToken:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

Ответ 22

В моем случае это очень смешно. Я получаю ошибку 419, когда я помещаю Auth::routes() в верхней части файла маршрута.

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', '[email protected]')->name('dashboard');
});

И я исправил ошибку, переместив Auth::routes(); в конец файла маршрута.

Route::middleware('auth')->group(function () {
    Route::get('/', '[email protected]')->name('dashboard');
});

Auth::routes();

Может быть, это может помочь и вашему делу. Удачи.

Ответ 23

Это странно.

У меня есть два проекта Laravel , и оба из версии Laravel все 5.8.16.

один проект laravel должен использовать @csrf ,, а другой проект должен использовать {{csrf_field()}}

это неразумно ~~

Ответ 24

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

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

Ответ 25

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

  • Если вы используете "файл" в качестве драйвера сеанса, посмотрите на хранилище/рамки/сеансы, если сеансы сохраняются после обновить. Если нет, скорее всего из-за неправильной папки разрешения. Убедитесь, что ваше хранилище/папка имеют правильные права
  • Попробуйте отключить все Javascript на ваших страницах (либо отключив это через навигатор или внутри кода) и убедитесь, что "http_only" => верно,
  • Попробуйте использовать с 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 всегда меняет каждое обновление/запрос в Laravel 5.4.

Ответ 26

У меня также была такая проблема, и я обнаружил, что файлы сеанса были заблокированы для записи. Итак, я не знаю, используете ли вы свой Laravel с помощью таких вещей, как бродяга или докер, но я советую вам попробовать изменить права на каталог сеанса (и файлы, конечно) (когда вы запустите Laravel на виртуальной машине, вы должны изменять права локально и на виртуальной машине (например, при совместном использовании файлов через NFS)

Как это:

chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs

Я знаю, разрешение 777 - самое страшное бедствие, которое вы когда-либо могли себе представить. Но они удобны для устранения неполадок.

Чтобы быть уверенным, что я никогда не забывал об этом, я создал сценарий bash. (Вызывается lalog, только потому, что я хотел очистить файлы журнала и установить разрешения)

Примечание. Убедитесь, что вы используете это в каталоге сеанса. В files config/session.php указан files с объявлением. В моем случае:

<?php
//...........
'files' => storage_path('framework/sessions'),
//...........

Местоположение: /usr/bin/lalog (Это файл, а не каталог)
Выполнить в оболочке как lalog

#!/bin/bash
rm -rf /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log removed"
touch /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log created"
chmod -R 777 /home/username/Projects/x/storage/
echo "CHMOD 777 on Storage dir"

Предупреждение! Это позволит доступ на запись для всех, поэтому будьте осторожны с этим! Кроме того, может быть, есть некоторая полезная информация в файле журнала Laravel. (обязательно загляните в этот файл журнала перед запуском моего скрипта bash)

Кроме того, я знаю, что это уже упоминалось. Но, будьте полностью уверены, что вы всегда

  1. Разрешить использование файлов cookie в браузере, поэтому маркер может быть установлен в файлах cookie
  2. Проверьте, используете ли вы @csrf в файле @csrf

Форма должна быть чем-то вроде этого

<form method="POST" action="{{ route('login') }}">
@csrf
.......
</form>

Ответ 27

Вы неправильно добавили поле CSRF. Вместо @csrf вы должны использовать csrf_field() следующим образом:

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

Ответ 28

У меня была аналогичная проблема, и я нашел решение для этого

если вы эхо или распечатаете что-то из контроллера, а возврат - для просмотра этой проблемы.

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

Ответ 29

Просто измените .env SESSION_DRIVER = cookie

Ответ 30

использовать

{{@csrf_field()}}

insted из

@csrf