Demande de publication dans Laravel - Erreur - 419 Désolé, votre session / 419 votre page a expiré


88

J'ai installé Laravel 5.7

Ajout d'un formulaire au fichier \resources\views\welcome.blade.php

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

Ajouté au fichier \routes\web.php

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

Après l'envoi d'une requête POST:

419 Désolé, votre session a expiré. Veuillez actualiser et réessayer.

Dans la version, 5.6il n'y avait pas un tel problème.


Avez-vous essayé d'ajouter une redirection? Au lieu de return;vous pouvez appeler return redirect()->back();. D'après ce que je peux voir, l'application n'a rien à faire après la demande de publication. Vous pouvez peut-être le rediriger vers une vue après avoir traité la demande.
dcangulo

1
J'ai le même problème. Lorsque je passe à la session de base de données, cela se produit et lorsque je reviens à filefor SESSION_DRIVERin, .envcela fonctionne bien. Pourquoi la session basée sur la base de données ne fonctionne-t-elle pas?
Junaid Qadir

J'ai copié votre code exact dans une nouvelle installation de laravel 5.7. Ça a marché. Il y a un problème ailleurs.
Kyle Wardle

ce problème en raison d'un problème de jeton. J'ai essayé d'exécuter le même code comme celui-ci, mais n'obtiens aucune erreur. Vous devriez donner plus d'informations comme votre pilote de session, l'affichage de la valeur _token dans le formulaire. En outre, vous pouvez vous déboguer dans cette vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phpligne de fichier 67 pour savoir pourquoi
Bangnokia

1
J'ai réalisé que j'avais utilisé la sessionstable dans un but différent. Après avoir changé ce nom de table en un nom plus adapté et exécuté artisan session:tableet actualisé la migration, tout fonctionne
correctement

Réponses:


113

Avant de lire ci-dessous, assurez-vous que vous avez @csrfou {{ csrf_field() }}dans votre formulaire comme

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

Le message d'erreur Session expirée ou 419 pages expirées dans larvel s'affiche parce que quelque part votre vérification de jeton csrf échoue, ce qui signifie que le App\Http\Middleware\VerifyCsrfToken::classmiddleware est déjà activé. Dans le formulaire, la @csrfdirective sur les lames est déjà ajoutée, ce qui devrait également convenir.

Ensuite, l'autre domaine à vérifier est la session. La csrfvérification du jeton est directement impliquée dans votre session.Vous voudrez peut-être vérifier si votre pilote de session fonctionne ou non, par exemple un Redis mal configuré peut causer un problème.

Peut-être que vous pouvez essayer de changer votre pilote / logiciel de session à partir de votre .envfichier, les pilotes pris en charge sont indiqués ci-dessous

Pilotes de session pris en charge dans Laravel 5, Laravel 6 et Laravel 7 (Doc Link)

  • file - les sessions sont stockées dans stockage / framework / sessions.
  • cookie - les sessions sont stockées dans des cookies sécurisés et cryptés.
  • database - les sessions sont stockées dans une base de données relationnelle.
  • memcached/ redis- les sessions sont stockées dans l'un de ces magasins rapides basés sur le cache.
  • array - les sessions sont stockées dans un tableau PHP et ne seront pas persistantes.

Si votre formulaire fonctionne après le changement de pilote de session, alors quelque chose ne va pas avec ce pilote particulier, essayez de corriger l'erreur à partir de là.

Scénarios possibles sujets aux erreurs

  • Il est probable que les sessions basées sur des fichiers ne fonctionnent pas à cause des problèmes d'autorisation avec le /storagerépertoire (une recherche rapide sur Google vous cherchera la solution), rappelez-vous également que mettre 777 pour le répertoire n'est jamais la solution.

  • Dans le cas du pilote de base de données, votre connexion à la base de données peut être erronée, ou la sessionstable peut ne pas exister ou mal configurée (la mauvaise partie de configuration a été confirmée comme étant un problème selon le commentaire de @Junaid Qadir).

  • redis/memcached La configuration est erronée ou est manipulée par un autre morceau de code dans le système en même temps.

Il peut être judicieux d'exécuter php artisan key:generateet de générer une nouvelle clé d'application qui, à son tour, videra les données de session.

Effacer le cache du navigateur HARD , j'ai trouvé que Chrome et Firefox étaient plus coupables que je ne m'en souvienne.

En savoir plus sur l'importance des clés d'application


1
Parfois, c'est juste que les navigateurs, principalement Chrome, ne mettent pas la valeur de session Set-Cookie car elle est mal formée ou non standard. Ainsi, Laravel ne trouvera aucune valeur de session existante à partir de la requête HTTP à comparer à la _tokenvaleur reçue du FORM. Évitez d'utiliser SESSION_DOMAIN=...avec une adresse IP que les spécifications des cookies Chrome et HTTP considèrent comme non sécurisée.
KeitelDOG

J'ai le même problème, mais je ne reçois pas l'erreur constamment. Cela n'arrive que de temps en temps. Je suppose que cela signifie qu'il n'y a pas de problème avec le pilote de session, car il fonctionne 99% du temps. Mais j'utilise une application en direct et je reçois des plaintes de clients de temps en temps. C'est très rare cependant. J'utilise le pilote de session de fichier. Est-ce que quelqu'un sait pourquoi cela se produit dans mon cas? Merci
TheAngelM97

@ TheAngelM97 Vous pouvez facilement reproduire cette erreur en accédant à la page de connexion ou d'inscription. Ne faites rien pendant peut-être plus de 30 minutes. Ensuite, lorsque vous cliquez sur soumettre, le 419 Page Expiredapparaît. Par souci de convivialité, comment dire à un simple utilisateur ce qui vient de se passer et comment le résoudre?
Pathros

38

Ceci est dû au fait que le formulaire nécessite un csrf. Dans la version 5.7, ils l'ont changé en @csrf

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

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


6
Son formulaire comprend un jeton csrf. Je ne sais pas s'il l'a édité plus tard ou non.
eResourcesInc

ouais, sa forme a à l'origine un csrfchamp, je viens de regarder l'historique d'édition
Dexter Bengil

13

cas 1: si vous exécutez un projet dans votre système local comme 127.0.01: 8000,

puis

ajoutez SESSION_DOMAIN=votre fichier .env

ou dans votre config / session.php 'domain' => env('SESSION_DOMAIN', ''),

puis exécutez php artisan cache:clear

cas 2: si le projet est en cours d'exécution sur le serveur et que vous avez un domaine comme "mydomain.com"

ajoutez SESSION_DOMAIN=mydomain.comvotre fichier .env

ou dans votre config / session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

puis exécutez php artisan cache:clear


9

Que diriez-vous d'utiliser

{{ csrf_field() }} au lieu de @csrf

L'erreur 419 est principalement due à des problèmes de jeton csrf.


Tu veux dire {{ csrf_field() }}?
Travis Britz

9

J'utilise Laravel 5.7 J'ai eu le même problème et c'était parce que le jeton csrf n'était pas dans le formulaire, donc en ajoutant

@csrf

résolu le problème


7

Essayez de commenter \App\Http\Middleware\EncryptCookies::classdans \app\Http\Kernel.php J'ai un problème similaire et résolvez-le en le faisant. Probablement pas la meilleure solution car la sécurité, mais au moins cela fonctionnait.

Auparavant, j'ai essayé:

  • Vider le cache
  • Générer une nouvelle clé d'application
  • Exécutez mon application dans divers navigateurs (Chrome 70, Mozilla Firefox 57 et IE 11)
  • Exécutez mon application sur un autre ordinateur
  • Commenter \App\Http\Middleware\VerifyCsrfToken::classdans\app\Http\Kernel.php
  • Commenter \Illuminate\Session\Middleware\AuthenticateSession::classdans\app\Http\Kernel.php
  • Mettre à niveau et rétrograder Laravel (entre 5,6 et 5,7)

Mais aucun de ces éléments ci-dessus n'a fonctionné pour moi.

ÉDITER

Mon cas ici est que chaque fois que je me connecte, un nouveau fichier de session sera créé (l'ancien est toujours persistant, mais soudainement oublié. Vérifiez storage/framework/sessions) et un nouveau jeton CSRF est généré. Le problème ne vient donc pas de VerifyCsrfToken.

Comme @Vladd l'a mentionné dans la section des commentaires, vous ne devriez jamais commenter \App\Http\Middleware\VerifyCsrfToken::class. Vous devez vérifier que vous avez envoyé le bon TOKEN CSRF au serveur.


1
Parmi les moyens que vous avez mentionnés, seuls les commentaires de \ App \ Http \ Middleware \ VerifyCsrfToken :: class dans \ app \ Http \ Kernel.php ont fonctionné pour moi.
Lex Soft

1
Vider le cache, générer une nouvelle clé d'application + supprimer les cookies
dobs

Vous ne devez jamais c0mmenter \ App \ Http \ Middleware \ VerifyCsrfToken :: class. Pourquoi ferais-tu ça? Pour créer votre propre point faible dans l'application?
Vladd

@dobs Merci d'avoir ajouté '+ Supprimer les cookies' car j'obtenais une erreur 419 même après avoir fait tout ce que je pouvais et cela ne fonctionnait que lorsque j'ai effacé les cookies du navigateur / essayé en mode incognito.
Niraj Pandey

6

changez votre @csrfdans welcome.blade.php en<input type="hidden" name="_token" value="{{ csrf_token() }}">

donc votre code comme ceci:

<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

Cela pourrait être un problème avec votre session. Après avoir joué avec ces paramètres, j'ai résolu mon problème. Pour moi, cela s'est avéré être la dernière option.

  • Si vous utilisez "fichier" comme pilote de session, regardez dans le stockage / le framework / les sessions si les sessions sont enregistrées après une actualisation. Sinon, cela est probablement dû à des autorisations de dossier incorrectes. Vérifiez que votre stockage / dossier a le droit correct
  • Essayez de désactiver tout le Javascript de vos pages (soit en le désactivant via le navigateur ou à l'intérieur du code) et assurez-vous que 'http_only' => true,
  • Essayez d'utiliser avec et sans https
  • Assurez-vous que la variable SESSION_DRIVER n'est PAS nulle
  • Essayez de basculer entre 'encrypt' => false et 'encrypt' => true,
  • Essayez de changer le nom du cookie 'cookie' => 'laravelsession',
  • Essayez de définir votre SESSION_DOMAIN sur votre domaine réel OU null
  • Essayez de basculer entre 'secure' => env ('SESSION_SECURE_COOKIE', false) et 'secure' => env ('SESSION_SECURE_COOKIE', true),

Source: Laravel Session change toujours chaque actualisation / demande dans Laravel 5.4


Oui, après avoir essayé beaucoup d'autres choses, le SESSION_SECURE_COOKIEcommutateur (changé en false) l'a fait pour moi. (on localhost:8000)
Marten Koetsier

SESSION_SECURE_COOKIE était aussi le problème pour moi, je l'ai changé en suivant un guide d'optimisation de site Web.
Bram Janssen

pour moi cela fonctionne avec https mais pas avec http ... une idée pourquoi? merci pour la bonne réponse, m'a pris des heures pour le trouver.
sharkyenergy le

4

ajoutez un jeton csrf et votre problème sera résolu. {{csrf_token}} ou @csrf


4

Pour résoudre cette erreur, vous devez d'abord insérer l'une des commandes suivantes dans la balise form.

@csrf OU {{ csrf_field }}

Si votre problème n'est pas résolu, procédez comme suit: (Notez que l'une des commandes ci-dessus doit être dans la balise form)

1.Insérez l'une des commandes suivantes dans la balise de formulaire @csrfOU{{ csrf_field }}

2.Ouvrez le fichier .env et remplacez les valeurs par le "fichier" dans la section SESSION_DRIVER.

3.Ensuite, vous devez réinitialiser le cache laravel. tapez ci-dessous les commandes dans le terminal

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

php artisan config:cache

Dans la dernière étape, débranchez le projet du service et cliquez à nouveau sur php artisan serve

J'espère que votre problème est résolu


3

Après tant de temps, je l'ai résolu de cette façon

Mon chemin d'installation de laravel n'était pas le même que celui défini dans le fichier de configuration session.php

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

2

C'est peut-être exagéré, mais vous pouvez essayer ceci:

// Formulaire appelant la route nommée avec un champ de jeton caché ajouté.

<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 nommée

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

// Ajoutez ceci dans le <head></head>bloc:

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

Je l'ai testé sur mon local en utilisant Homestead sur Laravel 5.7 qui était une nouvelle installation à l'aide de Laravel Installer 2.0.1 et cela a fonctionné. Quel est votre environnement?

Théorie: Je me demande si cela a quelque chose à voir avec la lame de rendu des balises html avec par {{ }}rapport à {!! !!}votre environnement ou la façon dont vous le servir (par exemple. php artisan serve). Ce qui me fait penser que c'est line 335de /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpdevrait rendre la même ligne tapée manuellement ci-dessus.


Ouais cool, mais les <meta>balises doivent être placées dans le <head>, pas à l'intérieur du <body>. Je ne suis pas sûr que le validateur HTML aimerait cela.
emix

Je dirais que vous avez raison et que cela devrait être déplacé vers la tête.
jeremykenedy

2

Il n'y a aucun problème dans le code. J'ai vérifié avec le même code que vous avez écrit avec la nouvelle installation.

Code de formulaire:

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

web.php code de fichier:

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

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

Le résultat après avoir soumis le formulaire est: Sortie après soumission du formulaire

Si vous effacez le cache de votre navigateur ou essayez avec un autre navigateur, je pense que cela sera corrigé.


2

Une mauvaise approche rapide est d'aller dans app \ http \ middleware \ verifycsrftoken.php et d'ajouter la route dans $ except list. La demande de publication sera ignorée pour la vérification du jeton CSRF.

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

2

419 | page cette erreur signifie un problème de sécurité laravel, cela signifie que le champ du jeton csrf n'est pas utilisé correctement.

utilisez {{csrf_field}} et votre problème sera résolu.


2

Cela devrait fonctionner si vous essayez toutes ces étapes:

  1. Assurez-vous que votre session est bien configurée, le moyen le plus simple est de créer un fichier et de vous assurer que le dossier de stockage a l'autorisation chmod 755, puis dans votre .envconfiguration, le pilote de session de fichier est le moyen le plus simple de définir.

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. Assurez-vous que le dossier Cache est effacé et accessible en écriture, vous pouvez le faire en exécutant la commande artisanale ci-dessous.

    php artisan cache:clear
    
  3. Assurez-vous que les autorisations de dossier sont bien définies, elles doivent être configurées comme ci-dessous:

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. Assurez-vous que votre formulaire a @csrf jeton.

J'espère que cela résoudra votre problème.


1

Dans votre Http/Kernel.php

essayez de commenter cette ligne:

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

dans votre tableau middleware Web

cela pourrait être la racine de votre problème


1

Par défaut, je n'ai pas eu ce problème. Donc ce que j'ai fait, c'est chmod -R 644 sessions reproduire le problème.

entrez la description de l'image ici

Ensuite, j'ai donné des autorisations au dossier de sessions par chmod -R 755 sessions

maintenant mon code de projet fonctionne à nouveau.

entrez la description de l'image ici

La raison pour laquelle cela se produit est que vous stockez votre cache dans un fichier sans autorisation d'écriture.

Le fichier de configuration de session est stocké dans config / session.php. Assurez-vous de passer en revue les options disponibles dans ce fichier. Par défaut, Laravel est configuré pour utiliser le pilote de session de fichier, qui fonctionnera bien pour de nombreuses applications. Dans les applications de production, vous pouvez envisager d'utiliser les pilotes memcached ou redis pour des performances de session encore plus rapides.

Solutions:

1 - Comme je l'ai fixé ci-dessus, vous pouvez donner 755 l'autorisation au dossier sessions. 2 - Vous pouvez utiliser une autre configuration de pilote de session.

fichier - les sessions sont stockées dans stockage / framework / sessions. cookie - les sessions sont stockées dans des cookies sécurisés et cryptés. base de données - les sessions sont stockées dans une base de données relationnelle. memcached / redis - les sessions sont stockées dans l'un de ces magasins rapides basés sur le cache. array - les sessions sont stockées dans un tableau PHP et ne seront pas persistantes.

Garder à l'esprit; Si vous souhaitez utiliser memcached / redis, vous devez les installer sur votre serveur ou votre conteneur docker redis doit être en cours d'exécution.


1

En fait, CSRF est un jeton basé sur une session. Ajoutez votre route dans un groupe de routes et ajoutez un middleware qui contrôle les sessions.

web est un middleware par défaut dans laravel et il peut contrôler les demandes de session.

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

1

Si vous avez déjà le csrf directive , vous avez peut-être changé la façon dont les sessions s'exécutent.

Dans config/session.php, cochez la case «sécurisé» champ . Il doit être sur false si https n'est pas disponible sur votre serveur.

Vous pouvez également mettre SESSION_SECURE_COOKIE=FALSEvotre .envfichier (répertoire racine).


1

ouvrez la ligne de commande cmd sur votre projet.

1. commande

php artisan config:cache

2.com et

php artisan route:clear

1

Avez-vous également le csrf dans l'en-tête de votre application?

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

1

Bien que le formulaire ait @csrf, il montre toujours419 pages has expired

Je l'ai résolu après l' SESSION_SECURE_COOKIEoption de mise à jour sur false dans config / session.php

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

que vider le cache


1

Accédez à config / sessions.php

trouver la ligne

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

changez-le en faux

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

Si ce paramètre est défini sur TRUE, le navigateur vous demandera d'utiliser le protocole HTTPS, sinon il ne stockera pas la session. Comme ce n'est pas valide


1

Je viens de parcourir tout cela et je planais ici pour une réponse .. Dans mon cas, la solution était d'effacer l'historique du navigateur.


1

Dans mon cas, il y avait un?> À la fin de routes.php. J'y ai passé beaucoup de temps ...


même, j'ai oublié d'ajouter ?>à la fin deweb.php
msalihbindak

0

J'avais exactement le même problème et c'était parce que j'étais complètement stupide. J'avais désactivé tous les champs du formulaire (plutôt que simplement le bouton d'envoi) via javascript avant de soumettre ledit formulaire! Ceci, bien sûr, a eu pour conséquence que tous les éléments du formulaire n'étaient pas soumis (y compris les éléments masqués_token champ ), ce qui a entraîné l'erreur 419!

J'espère que cela aide quelqu'un de quelques heures à se gratter la tête!

Les entrées de formulaire désactivées n'apparaissent pas dans la demande


0

J'ai eu ce problème il y a longtemps. Je me suis souvenu qu'il provoque la permission de storage/framework/sessions. Vous voudrez peut-être le changer par chmod -R 0777 storage/framework/sessionscommande. Cela a fonctionné pour moi.


0

Dans mon cas, c'est très ridicule. J'obtiens l'erreur 419 lorsque je mets Auth::routes()en haut du fichier d'itinéraire.

Auth::routes();

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

Et j'ai corrigé l'erreur en passant Auth::routes();au bas du fichier d'itinéraire.

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

Auth::routes();

Peut-être que cela peut également aider votre cas. Bonne chance.


0

Veuillez noter que vous obtenez l'erreur 419 si vous essayez de télécharger un gros fichier qui dépasse la limite de taille du fichier de publication. Dans ce cas, vous pouvez augmenter à la fois upload_max_filesize et post_max_size à un montant raisonnable (par exemple, 10M ou 20M dépend de votre cas d'utilisation et de vos ressources), vérifiez ici: https://stackoverflow.com/a/2184541/2100489

Mais cela peut entraîner des problèmes de consommation de ressources, par exemple la bande passante et le stockage. Comme solution, vous pouvez vérifier la taille du fichier avant de soumettre le formulaire et afficher un message d'avertissement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.