Je suis nouveau chez Laravel et j'ai un problème que je ne comprends pas ... J'ai un journal dans mon projet et ma méthode est POST. Lorsque j'essaie une requête, le résultat est le suivant: 'La page a expiré pour cause d'inactivité. Veuillez actualiser et réessayer.' , mais si je change la méthode en GET, cela fonctionne bien. Quelqu'un peut-il me dire pourquoi et comment y remédier, bien sûr, j'ai besoin de la méthode post.
Ce problème provient de la vérification du jeton CSRF qui échoue. Donc, soit vous n'en publiez pas, soit vous en publiez une incorrecte.
La raison pour laquelle cela fonctionne pour GET est que, pour un itinéraire GET à Laravel, aucun jeton CSRF n'est posté.
Vous pouvez poster un jeton CSRF dans votre formulaire en appelant:
{{ csrf_field() }}
Ou exclure votre itinéraire (NON RECOMMANDÉ EN RAISON DE LA SÉCURITÉ) dans app/Http/Middleware/VerifyCsrfToken.php
:
protected $except = [
'your/route'
];
Dans mon cas, j'ai le même message d'erreur et j'ai ensuite découvert que je n'avais pas ajouté csrf_token
pour le champ de formulaire. Ajoutez ensuite le csrf_token
.
En utilisant un assistant de forme qui sera,
{{ csrf_field() }}
Ou sans aide de forme qui sera,
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Si cela ne fonctionne pas, alors-
Actualiser le cache du navigateur
et maintenant cela pourrait fonctionner, merci.
Mise à jour pour Laravel 5.6
Laravel intègre le nouveau @csrf
au lieu de {{ csrf_field() }}
. Cela a l'air plus gentil maintenant.
<form action="">
@csrf
...
</form>
Chaque fois que vous définissez un formulaire HTML dans votre application, vous devez inclure un champ de jeton CSRF masqué dans le formulaire afin que le middleware de protection CSRF puisse valider la demande. Vous pouvez utiliser l’assistant csrf_field
pour générer le champ de jeton:
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
Cela ne fonctionne pas, puis actualisez le cache du navigateur et cela pourrait fonctionner maintenant,
Pour plus de détails ouvrir le lien: - CSRF Protection in Laravel 5.5
METTRE À JOUR:
Avec Laravel 5.6 et les modèles de lames, c’est très simple.
<form method="POST" action="/profile">
@csrf
...
</form>
Pour plus de détails ouvrir le lien: - CSRF Protection in Laravel 5.6
Vérifiez que votre fichier config/session.php contient cette ligne
'domain' => env('SESSION_DOMAIN', null),
Ensuite, supprimez la ligne SESSION_DOMAIN
dans votre fichier .env
Cela est dû au fait que vous utilisez le middleware CSRV par défaut de l'installation de Laravel. Pour résoudre ce problème, supprimez cette ligne de votre fichier Kernel.php:
\App\Http\Middleware\VerifyCsrfToken::class,
C'est bien si vous construisez une API. Toutefois, si vous construisez un site Web, il s'agit d'une vérification de sécurité. Soyez donc conscient de ses risques.
J'ai essayé différentes solutions pour résoudre le problème pendant plusieurs semaines sans succès.
Le problème que je rencontrais a été causé par la mise à niveau de laravel 5.0 à 5.5 et j'ai oublié de mettre à jour config/session.php
Si quelqu'un fait face au problème, essayez de mettre à jour le fichier config/session.php afin qu'il corresponde à la version de Laravel que vous utilisez.
j'ai eu le même problème. utilisez 'clear navigation data' en chrome. peut-être résoudre votre problème.
si votre configuration est définie: SESSION_DRIVER = fichier, vous devez vérifier si votre répertoire de session est en écriture. Vérifier le stockage/framework/session
Je faisais face à la même erreur alors je viens de supprimer cette ligne de mon fichier .env
SESSION_DRIVER = yourwebsite.com
Il suffit de placer ce code dans le formulaire
<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />
Dans mon cas, j'ai ajouté ob_start (); au sommet de mon index.php sur le serveur et tout semble bien fonctionner.
Si vous avez déjà inclus le jeton CSRF dans votre formulaire. Ensuite, vous obtenez la page d'erreur probablement en raison de la présence de données en cache dans votre formulaire. Ouvrez votre invite de terminal/de commande et exécutez ces commandes à la racine du projet.
Essayez également de vider le cache du navigateur avec l'exécution de ces commandes.
Quiconque a encore ce problème utilise le code suivant dans votre formulaire comme ci-dessous.
echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';
Exclusion des URI de la protection CSRF:
Parfois, vous pouvez souhaiter exclure un ensemble d'URI de la protection CSRF. Par exemple, si vous utilisez Stripe pour traiter des paiements et utilisez son système webhook, vous devez exclure votre itinéraire de gestionnaire de compte Web Stripe de la protection CSRF car Stripe ne saura pas quel jeton CSRF envoyer sur vos itinéraires.
En règle générale, vous devez placer ces types de routes en dehors du groupe de middleware Web que RouteServiceProvider applique à toutes les routes du fichier routes/web.php. Cependant, vous pouvez également exclure les routes en ajoutant leurs URI à la propriété $ except du middleware 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/*',
];
}
C'est drôle mais ça marche pour moi. J'ai réalisé que cela est dû au défaut HTML TAG dans le code Laravel. Utilisez/* */ou {{- -}} à la place
Ou essayez de supprimer le code HTML récemment entré dans votre code ....__ ou modifiez le commentaire Html en commentaire Php ... Ou essayez d'exécuter une commande quelconque de Worng artisan comme le navigateur propre de php artisan données avec elle erreur ...
si vous avez besoin de changer forme action avec Javascript vous aurez le même problème
1 .first vous devez utiliserau lieu de {!!Form::open() !!} {!! close() !!}
dans laravel
2 .seconde vous commencez le plus votre action avec https://www.example.com +your Route
Ne pas oublier www dans votre URL !!!
Il se peut que le jeton CSRF n'ait pas dans votre formulaire. Vous devez utiliser @crsf
ou {{ csrf_field() }}
Si vous utilisez csrf sur votre formulaire. Ce peut être cache. Videz le cache de votre application.
php artisan cache: effacer
vue artisan php: effacer
php artisan cache: effacer
Et effacez le cache de votre navigateur.
clé artisan php: générer
J'ai eu le même problème, j'ai essayé beaucoup de solutions. mais aucun n'a fonctionné pour moi. puis j'ai découvert que, pour une raison quelconque, je l'utilisais dans mon fichier .env:
SESSION_DOMAIN = myapp.me
et dès que je l'ai remis à zéro, tout a bien fonctionné.
mon problème est résolu en ajoutant simplement @csrf
dans la balise de formulaire
Laravel 5.6
ne supporte pas {{ csrf_field() }}
, ajoutez simplement @csrf
à la place de {{ csrf_field() }}
larvel_fix_error.png
Dans mon cas, le même problème était dû au fait que j'avais oublié d'ajouter >
à la fin de mon champ de saisie masqué, comme suit: <input type="hidden" name="_token" value="{{ Session::token() }}"
Donc, je l'ai corrigé en l'ajoutant:
<input type="hidden" name="_token" value="{{ Session::token() }}">
Nous l'avons fait fonctionner en copiant les routes de Router.php au lieu d'utiliser Auth :: routes (), voici les routes dont vous avez besoin:
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
Je sais que cette question a reçu une réponse satisfaisante, mais je voulais mentionner un correctif qui a fonctionné dans mon cas. J'ai ajouté {{ csrf_field() }}
et cela ne fonctionnait toujours pas.
Ensuite, je me suis rappelé que j'avais bloqué tous les cookies à des fins de développement, ce qui peut être agréable lorsque vous modifiez la page et souhaitez l'actualiser.
Une fois que j'ai modifié les paramètres pour arrêter de bloquer tous les cookies dans MS Edge browser
, le problème a disparu.
Commencez par inclure CSRF dans votre formulaire.
{{ csrf_field() }}
si le problème ne résout pas le problème, utilisez ob_start();
au tout début de index.php.
<?php ob_start();
Ajoutez simplement @csrf
dans votre balise de formulaire.
Ou vous pouvez inclure csrf_token
dans l'en-tête pour l'envoyer à chaque demande.