Champ caché global de jeton CSRF Laravel 5 pour tous les formulaires dans une page
J'ai récemment migré à Laravel 5, et maintenant CSRF vérifier sur chaque post de présentation. J'ai pensé à le retirer, mais je veux suivre les meilleures pratiques, donc je vais le garder de cette façon.
D'autre part, je suis les problèmes de soumettre des requêtes ajax.. ma page a de multiples formes et à certains commentaires ne sont même pas de formes, de simples appels ajax. Mon idée est d'avoir un seul cachés "jeton d'entrée" sur la page et la joindre à chaque demande. Existe-il des inconvénients à avoir l'universel, seul jeton d'entrée?
Aussi, comment puis-je sortie le jeton? Serait-il ok pour créer un caché d'entrée sur le pied de page?
source d'informationauteur raphadko
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas d'inconvénients. Vous pouvez facilement créer un mondial jeton de champ dans votre fichier de mise en page:
Ou si vous utilisez le générateur de formulaire:
En jQuery vous pouvez utiliser quelque chose comme cette pour fixer le jeton à chaque demande.
Il y a un helper pour ajouter la forme de jeton à l'intérieur des formes. Vous pouvez simplement utiliser
à l'intérieur de la formes. Il va ajouter le caché d'entrée et le jeton.
Vous pouvez utiliser quelque chose comme ceci au bas de la page:
Cela ajoute un caché d'entrée pour tous vos
forms
:Et pour toutes vos demandes d'AJAX:
Voici quelques extraits de la façon dont j'ai obtenu mon CSRF de travail pour tous les différents scénarios dans ma jQuery Mobile application que j'ai récemment mis à niveau pour utiliser Laravel 5:
J'ai ajouté un chiffrés jeton csrf dans une variable qui sera transmis à mon point de vue dans mon principal du contrôleur de base:
app\Http\Controllers\MyController.php
Ensuite, j'ai ajouté la balise meta dans ma vue principale de l'en-tête:
resources\views\partials\htmlHeader.blade.php
Puis, j'ai également ajouté cette jquery fragment comme suggéré dans certains forums:
Mais, la clé (pour ma configuration au moins) a été l'ajout de la vérification de l'
XSRF-TOKEN
cookie dans mon custom VerifyCsrfToken middleware:app\Http\Middleware\VerifyCsrfToken.php:
Avant j'ai ajouté que, juste au sujet de tous mes AJAX Postes (y compris les soumissions de formulaire et lazyloading listviews) ont été des échecs dus à une
TokenMismatchException
.EDIT:
À la réflexion, je ne suis pas sûr de savoir comment beaucoup de sens, il permet de comparer le jeton de session avec l'objectif fixé par le cookie (qui seraient venus de l'jeton de session en premier lieu le droit?). Qui peuvent avoir été en contournant la sécurité de tous.
Je pense que mon principal problème était avec le jquery extrait ci-dessus, qui était censé être l'ajout de la X-XSRF-JETON en-tête pour chaque requête ajax. Qui n'a pas de travail pour moi dans mon jQuery Mobile app (en particulier, dans mon lazyloader plugin) jusqu'à ce que j'ai ajouté quelques options pour le plugin lui-même. J'ai ajouté un nouveau sélecteur par défaut
csrf
(ce qui seraitmeta[name="_token"]
dans ce cas) et un nouveau paramètre par défautcsrfHeaderKey
(ce qui seraitX-XSRF-TOKEN
dans ce cas). En gros, lors de l'initialisation du plugin, un nouveau_headers
propriété est initialisée avec le jeton CSRF si l'on est repérable par lescsrf
sélecteur (par défaut ou définie par l'utilisateur). Puis, dans les 3 lieux où l'ajax POST peut être tiré (lors de la réinitialisation des variables de session ou lorsque lazyloading une listview) les en-têtes option de $.ajax est définie avec tout ce qui est dans_headers
.De toute façon, depuis le X-XSRF-JETON reçu sur le serveur-côté vient de la cryptés la méta _token, je pense que la protection CSRF travaille maintenant comme il se doit.
Mon
app\Http\Middleware\VerifyCsrfToken.php
ressemble maintenant à ceci (qui est essentiellement à la valeur par défaut de mise en œuvre fournis par Laravel 5 - LOL):Je pense que vous pouvez faire quelque chose comme ça (pas testé sera mise à jour si je reçois une chance)
en fait vous pourriez vouloir stocker jeton dans une variable que vous reupdate qu'il expire.
Le bénéfice de l'ajoutant sur "soumettre" est, si vous ajoutez des éléments via ajax je pense que ça va encore travailler sans avoir à ajouter quoi que ce soit d'autre.
EDIT: Voici un excellent article sur l'utilisation de Rails UJS avec Laravel (qui inclut cette auto FSCC jeton fonctionnalité): https://medium.com/@barryvdh/unobtrusive-javascript-with-jquery-ujs-and-laravel-e05f444d3439
Vous avez besoin de passer le long de l'en-tête
X-XSRF-TOKEN
qui contient une version chiffrée de lacsrf-token
.Il existe deux façons dont cela peut être fait à ce que je sache. Vous pouvez chiffrer le jeton et le transmettre à la vue:
Ou vous pouvez récupérer le jeton de cookies à l'aide de JavaScript (Angular rend ce facile). En vanilla JS vous pourriez faire quelque chose comme ceci:
En jQuery vous pourriez faire quelque chose comme cela pour la requête ajax: