Publicar solicitud en Laravel - Error - 419 Lo sentimos, su sesión / 419 su página ha expirado

88

Instalé Laravel 5.7

Se agregó un formulario al archivo. \resources\views\welcome.blade.php

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

Agregado al archivo \routes\web.php

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

Después de enviar una solicitud POST:

419 Lo sentimos, su sesión ha expirado. Por favor, actualice y pruebe de nuevo.

En la versión 5.6no hubo tal problema.

Thủ Thuật Máy Tính
fuente
¿Ha intentado agregar una redirección? En lugar de return;puede llamar return redirect()->back();. Por lo que puedo ver, la aplicación no tiene nada que hacer después de la solicitud de publicación. Tal vez pueda redirigirlo a una vista después de procesar la solicitud.
dcangulo
1
Tengo el mismo problema. Cuando cambio a la sesión de base de datos y esto sucede cuando cambio de nuevo a filepara SESSION_DRIVERen .envque trabaja muy bien. ¿Por qué no funciona la sesión basada en la base de datos?
Junaid Qadir
Copié tu código exacto en una nueva instalación de laravel 5.7. Funcionó. Hay un problema en otra parte.
Kyle Wardle
este problema debido al problema del token. He intentado ejecutar el mismo código como este, pero no obtengo ningún error. Debe proporcionar más información, como el controlador de sesión, la visualización del valor _token en el formulario. Además, puede depurar usted mismo en esta vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phplínea de archivo 67 para saber por qué
bangnokia
1
Me di cuenta de que había usado la sessionsmesa para un propósito diferente. Después de cambiar el nombre de esta tabla por uno más adecuado y ejecutar artisan session:tabley actualizar la migración, todo funciona bien
Junaid Qadir

Respuestas:

113

Antes de leer a continuación, asegúrese de tener @csrfo {{ csrf_field() }}en su forma como

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

Aparece el mensaje de error Session Expired o 419 Page Expired en larvel porque en algún lugar falla la verificación del token csrf, lo que significa que el App\Http\Middleware\VerifyCsrfToken::classmiddleware ya está encendido. En la forma en que @csrfya se agregó la directiva Blade, lo que también debería estar bien.

Entonces, la otra área a verificar es la sesión. La csrfverificación del token está directamente relacionada con su sesión, por lo que es posible que desee verificar si el controlador de su sesión está funcionando o no, por ejemplo, un Redis configurado incorrectamente podría causar un problema.

Tal vez pueda intentar cambiar su controlador / software de sesión desde su .envarchivo, los controladores compatibles se proporcionan a continuación

Controladores de sesión compatibles en Laravel 5, Laravel 6 y Laravel 7 (Doc Link)

  • file - las sesiones se almacenan en almacenamiento / marco / sesiones.
  • cookie - las sesiones se almacenan en cookies seguras y cifradas.
  • database - las sesiones se almacenan en una base de datos relacional.
  • memcached/ redis- las sesiones se almacenan en uno de estos almacenes rápidos basados ​​en caché.
  • array - las sesiones se almacenan en una matriz PHP y no se conservarán.

Si su formulario funciona después de cambiar el controlador de sesión, entonces algo está mal con ese controlador en particular, intente corregir el error desde allí.

Posibles escenarios propensos a errores

  • Es posible que las sesiones basadas en archivos no funcionen debido a los problemas de permisos con el /storagedirectorio (una búsqueda rápida en Google te traerá la solución), también recuerda que poner 777 para el directorio nunca es la solución.

  • En el caso del controlador de la base de datos, es posible que su conexión de base de datos sea incorrecta, o que la sessionstabla no exista o esté mal configurada (se confirmó que la parte de configuración incorrecta es un problema según el comentario de @Junaid Qadir).

  • redis/memcached La configuración es incorrecta o está siendo manipulada por algún otro código en el sistema al mismo tiempo.

Puede ser una buena idea ejecutar php artisan key:generatey generar una nueva clave de aplicación que, a su vez, eliminará los datos de la sesión.

Clear Browser Cache HARD , encontré que Chrome y Firefox son los culpables más de lo que puedo recordar.

Obtenga más información sobre por qué son importantes las claves de la aplicación

Shobi
fuente
1
A veces es solo que los navegadores, principalmente Chrome, no ponen el valor de sesión Set-Cookie porque está mal formado o no es estándar. Por lo tanto, Laravel no encontrará ningún valor de sesión existente de la solicitud HTTP para compararlo con el _tokenvalor recibido del FORMULARIO. Evite el uso SESSION_DOMAIN=...con IP que Chrome y las especificaciones de cookies HTTP consideren inseguras.
KeitelDOG
Tengo el mismo problema, pero no recibo el error constantemente. Simplemente ocurre de vez en cuando. Supongo que eso significa que no hay problema con el controlador de sesión, porque funciona el 99% del tiempo. Pero estoy ejecutando una aplicación en vivo y recibo quejas de los clientes de vez en cuando. Sin embargo, es muy raro. Estoy usando el controlador de sesión de archivos. ¿Alguien sabe por qué sucede esto en mi caso? Gracias
TheAngelM97
@ TheAngelM97 Puede reproducir fácilmente este error yendo a la página de inicio de sesión o de registro. No hagas nada durante, tal vez, más de 30 minutos. Luego, cuando hace clic en enviar, 419 Page Expiredaparece. En aras de la usabilidad, ¿cómo le dices a un simple usuario lo que acaba de suceder y cómo solucionarlo?
Pathros
38

Esto se debe a que el formulario requiere un csrf. En la versión 5.7, lo cambiaron a @csrf

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

Referene: https://laravel.com/docs/5.7/csrf

David
fuente
6
Su formulario incluye un token csrf. No estoy seguro de si lo editó más tarde o no.
eResourcesInc
sí, su formulario originalmente tiene un csrfcampo, solo miré en el historial de ediciones
Dexter Bengil
13

caso 1: si está ejecutando un proyecto en su sistema local como 127.0.01: 8000,

entonces

agregue SESSION_DOMAIN=su archivo .env

o en su config / session.php 'domain' => env('SESSION_DOMAIN', ''),

y luego corre php artisan cache:clear

caso 2: si el proyecto se está ejecutando en el servidor y tienes un dominio como "midominio.com"

agregue SESSION_DOMAIN=mydomain.comsu archivo .env

o en su config / session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

y luego corre php artisan cache:clear

Mistry Saurabh
fuente
9

¿Qué tal usar

{{ csrf_field() }} en vez de @csrf

El error 419 se debe principalmente a problemas con el token csrf.

Bonish Koirala
fuente
¿Te refieres {{ csrf_field() }}?
Travis Britz
9

Utilizo Laravel 5.7 Tuve el mismo problema y fue porque el token csrf no estaba en el formulario, así que agregando

@csrf

solucionó el problema

Karim Samir
fuente
7

Intente comentar \App\Http\Middleware\EncryptCookies::classen \app\Http\Kernel.php Tengo un problema similar y lo resolví haciéndolo. Probablemente no sea la mejor solución por la seguridad, pero al menos funcionó.

Anteriormente intenté:

  • Limpiar cache
  • Generar nueva clave de aplicación
  • Ejecute mi aplicación en varios navegadores (Chrome 70, Mozilla Firefox 57 e IE 11)
  • Ejecuta mi aplicación en otra computadora
  • Comentar \App\Http\Middleware\VerifyCsrfToken::classen\app\Http\Kernel.php
  • Comentar \Illuminate\Session\Middleware\AuthenticateSession::classen\app\Http\Kernel.php
  • Actualizar y degradar Laravel (entre 5.6 y 5.7)

Pero ninguno de los anteriores funcionó para mí.

EDITAR

Mi caso aquí es que cada vez que inicie sesión, se creará un nuevo archivo de sesión (el anterior aún persiste, pero de repente se olvida. Verifique storage/framework/sessions) y se genera un nuevo token CSRF. Entonces, el problema no está con VerifyCsrfToken.

Como mencionó @Vladd en la sección de comentarios, nunca debe comentar \App\Http\Middleware\VerifyCsrfToken::class. Debe verificar que envió el TOKEN CSRF correcto al servidor.

Prasna Lukito
fuente
1
Entre esas formas que mencionaste, solo comentar \ App \ Http \ Middleware \ VerifyCsrfToken :: class in \ app \ Http \ Kernel.php funcionó para mí.
Lex Soft
1
Borrar caché, generar nueva clave de aplicación + eliminar cookies
dobs
Nunca deberá comentar \ App \ Http \ Middleware \ VerifyCsrfToken :: class. ¿Por qué harías eso? ¿Para crear su propio punto débil en la aplicación?
Vladd
@dobs Gracias por agregar '+ Eliminar cookies' porque recibí un error 419 incluso después de hacer todo lo posible y solo funcionó cuando borré las cookies del navegador / lo intenté en modo incógnito.
Niraj Pandey
6

cambia tu @csrfen welcome.blade.php a<input type="hidden" name="_token" value="{{ csrf_token() }}">

entonces tu código como este:

<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>
Aghnat Atqiya
fuente
6

Podría ser un problema con su sesión. Después de jugar con esta configuración, resolví mi problema. Para mí resultó ser la última opción.

  • Si está utilizando "archivo" como controlador de sesión, busque en almacenamiento / marco / sesiones si las sesiones se guardan después de una actualización. De lo contrario, lo más probable es que se deba a permisos de carpeta incorrectos. Verifique que su almacenamiento / carpeta tenga el derecho correcto
  • Intente deshabilitar todo el Javascript en sus páginas (ya sea deshabilitándolo a través del navegador o dentro del código) y asegúrese de que 'http_only' => true,
  • Intenta usar con y sin https
  • Asegúrese de que la variable SESSION_DRIVER NO sea nula
  • Intente cambiar entre 'cifrar' => falso y 'cifrar' => verdadero,
  • Intente cambiar el nombre de la cookie 'cookie' => 'laravelsession',
  • Intente establecer su SESSION_DOMAIN en su dominio real O nulo
  • Intente cambiar entre 'seguro' => env ('SESSION_SECURE_COOKIE', falso) y 'seguro' => env ('SESSION_SECURE_COOKIE', verdadero),

Fuente: Laravel Session siempre cambia cada actualización / solicitud en Laravel 5.4

Bram Janssen
fuente
Sí, después de probar muchas otras cosas, el SESSION_SECURE_COOKIEinterruptor (lo cambió a false) lo hizo por mí. (en localhost:8000
marcha
SESSION_SECURE_COOKIE también fue un problema para mí, lo cambié al seguir una guía para la optimización de sitios web.
Bram Janssen
para mí funciona con https pero no con http ... ¿alguna idea de por qué? gracias por la gran respuesta, me tomó horas encontrarla.
sharkyenergy
4

agregue el token csrf y su problema se resolverá. {{csrf_token}} o @csrf

samair ali
fuente
4

Para resolver este error, primero debe insertar uno de los siguientes comandos en la etiqueta del formulario.

@csrf O {{ csrf_field }}

Si su problema no se resuelve, haga lo siguiente: (Tenga en cuenta que uno de los comandos anteriores debe estar en la etiqueta del formulario)

1.Inserte uno de los siguientes comandos en la etiqueta del formulario @csrfO{{ csrf_field }}

2. Abra el archivo .env y cambie los valores al "archivo" en la sección SESSION_DRIVER.

3.Entonces debes restablecer la caché de laravel. escriba los siguientes comandos en la terminal

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

php artisan config:cache

4.En el paso final, desconecte el proyecto del servicio y haga clic nuevamente en php artisan serve

Espero que tu problema este resuelto

manguera azimi
fuente
3

Después de tanto tiempo lo resolví de esta manera

Mi ruta de instalación de laravel no era la misma que la configurada en el archivo de configuración session.php

'domain' => env('SESSION_DOMAIN', 'example.com'),
ismail bangee
fuente
2

Puede ser exagerado, pero puedes probar esto:

// Formulario que llama a la ruta nombrada con un campo de token oculto agregado.

<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>

// Ruta nombrada

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

// Agrega esto dentro del <head></head>bloque:

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

Lo probé en mi local usando Homestead en Laravel 5.7, que fue una instalación nueva usando Laravel Installer 2.0.1 y funcionó. ¿Cuál es tu entorno?

Teoría: Me pregunto si eso tiene algo que ver con la renderización de etiquetas html de Blade {{ }}vs. {!! !!}en su entorno o cómo lo está sirviendo (por ejemplo php artisan serve). Lo que me hace pensar que es line 335de /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpdebe dar la misma línea escrita manualmente anteriormente.

jeremykenedy
fuente
Sí, genial, pero las <meta>etiquetas deben colocarse dentro del <head>, no dentro del <body>. No estoy seguro de que al validador de HTML le guste esto.
emix
Yo diría que tiene razón y eso debería trasladarse a la cabeza.
jeremykenedy
2

No hay ningún problema en el código. He verificado con el mismo código que ha escrito con la nueva instalación.

Código de formulario:

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

web.php código de archivo:

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

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

El resultado después de enviar el formulario es: Salida después de enviar el formulario

Si borras la memoria caché de tu navegador o lo intentas con otro navegador, creo que se solucionará.

engrhussainahmad
fuente
2

Un mal enfoque rápido es ir a app \ http \ middleware \ verifycsrftoken.php y agregar la ruta en $ except list. La solicitud de publicación se ignorará para la verificación del token CSRF.

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];
Qasim Ali
fuente
2

419 | página este error significa un problema de seguridad de laravel significa que el campo de token csrf no se usa correctamente.

use {{csrf_field}} y su problema será resuelto.

Flutterer
fuente
2

Debería funcionar si prueba todos estos pasos:

  1. Asegúrese de que su sesión esté bien configurada, la forma más fácil es convertirla en un archivo y asegurarse de que la carpeta de almacenamiento tenga el permiso chmod 755, luego, en su .envconfiguración, como se muestra a continuación, el controlador de sesión de archivo es la forma más fácil de configurar.

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. Asegúrese de que la carpeta Cache esté limpia y se pueda escribir, puede hacerlo ejecutando el comando artisan debajo.

    php artisan cache:clear
    
  3. Asegúrese de que los permisos de la carpeta estén bien establecidos, deben configurarse como se muestra a continuación:

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. Asegúrese de que su formulario tenga el @csrftoken incluido.

Espero que esto resuelva su problema.

Kamaro Lambert
fuente
1

En tus Http/Kernel.php

intenta comentar esta línea:

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

en su matriz de middleware web

podría ser la raíz de tu problema

Mathieu Ferre
fuente
1

Por defecto no tuve este problema. Entonces, lo que hice fue chmod -R 644 sessions replicar el problema.

ingrese la descripción de la imagen aquí

Luego di permisos a la carpeta de sesiones por chmod -R 755 sessions

ahora mi código de proyecto funciona de nuevo.

ingrese la descripción de la imagen aquí

La razón por la que sucede es que almacena su caché en un archivo sin permisos de escritura.

El archivo de configuración de la sesión se almacena en config / session.php. Asegúrese de revisar las opciones disponibles para usted en este archivo. De forma predeterminada, Laravel está configurado para usar el controlador de sesión de archivos, que funcionará bien para muchas aplicaciones. En aplicaciones de producción, puede considerar usar los controladores memcached o redis para un rendimiento de sesión aún más rápido.

Soluciones:

1 - Como he solucionado anteriormente, puede otorgar 755 permisos a la carpeta de sesiones. 2 - Puede utilizar otra configuración de controlador de sesión.

archivo: las sesiones se almacenan en almacenamiento / marco / sesiones. cookie: las sesiones se almacenan en cookies seguras y cifradas. base de datos: las sesiones se almacenan en una base de datos relacional. memcached / redis: las sesiones se almacenan en una de estas tiendas rápidas basadas en caché. matriz: las sesiones se almacenan en una matriz de PHP y no se conservarán.

Tener en cuenta; Si desea utilizar memcached / redis, debe tenerlos instalados en su servidor o su contenedor docker redis debe estar ejecutándose.

Anar Bayramov
fuente
1

En realidad, CSRF es un token basado en sesiones. Agregue su ruta en un grupo de rutas y agregue un middleware que controle las sesiones.

web es un middleware predeterminado en laravel y puede controlar las solicitudes de sesión.

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

Si ya tiene la directiva csrf , es posible que haya cambiado la forma en que se ejecutan las sesiones.

En config/session.php, marque el campo 'seguro' . Debería estar en falso si https no está disponible en su servidor.

También puede poner SESSION_SECURE_COOKIE=FALSEen su .envarchivo (directorio raíz).

Towelie
fuente
1

abra la línea de comando cmd en su proyecto.

1.comando

php artisan config:cache

2.com y

php artisan route:clear
Biblbroks42
fuente
1

¿También tiene el csrf en el encabezado de su aplicación?

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

Si bien el formulario tiene @csrf, todavía muestra419 pages has expired

Lo resolví después de la SESSION_SECURE_COOKIEopción de actualización a falso en config / session.php

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

que borrar caché

Kakada Neang
fuente
1

Vaya a config / sessions.php

encuentra la fila

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

cámbialo a falso

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

Si este parámetro se establece en TRUE, el navegador requerirá que use el protocolo HTTPS; de lo contrario, no almacenará la sesión. Como no es valido

Rafayel
fuente
1

Acabo de pasar por todo esto y estoy aquí esperando una respuesta ... En mi caso, la solución fue borrar el historial del navegador.

Ismael
fuente
1

En mi caso fue un?> Al final de las rutas.php. Pasé mucho tiempo allí ...

Juan Angel
fuente
mismo, me olvidé de agregar ?>al final deweb.php
msalihbindak
0

Simplemente tuve exactamente el mismo problema y se debía a que yo era completamente estúpido. ¡Había deshabilitado todos los campos del formulario (en lugar de solo el botón de envío) a través de javascript antes de enviar dicho formulario! Esto, por supuesto, dio como resultado que no se enviaran todos los elementos del formulario (incluido el _tokencampo oculto ), lo que a su vez generó el error 419.

¡Espero que esto ayude a alguien de unas horas de rascarse la cabeza!

Las entradas de formulario deshabilitadas no aparecen en la solicitud

Mancha
fuente
0

Tengo este problema hace mucho tiempo. Recordé que causa permiso de storage/framework/sessions. Es posible que desee cambiarlo mediante un chmod -R 0777 storage/framework/sessionscomando. Funcionó para mí.

Duy Nguyen
fuente
0

En mi caso, es muy ridículo. Recibo el error 419 cuando lo coloco Auth::routes()en la parte superior del archivo de ruta.

Auth::routes();

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

Y arreglé el error moviéndome Auth::routes();al final del archivo de ruta.

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

Auth::routes();

Quizás también pueda ayudar en su caso. Buena suerte.

Lyhong
fuente
0

Tenga en cuenta que recibe el error 419 si está intentando cargar un archivo grande que excede el límite de tamaño del archivo de publicación. En este caso, puede aumentar tanto upload_max_filesize como post_max_size a una cantidad razonable (por ejemplo, 10M o 20M depende de su caso de uso y recursos), consulte aquí: https://stackoverflow.com/a/2184541/2100489

Pero esto puede causar problemas de consumo de recursos, por ejemplo, ancho de banda y almacenamiento. Como solución, puede verificar el tamaño del archivo antes de enviar el formulario y mostrar un mensaje de advertencia.

Kiafar
fuente