Cet article vous présente principalement l'exemple de code pour la fermeture (ouverture) partielle de la vérification CSRF dans yii2. L’éditeur le trouve plutôt bien, alors j’aimerais le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un œil. J'espère que cela pourra aider tout le monde.
(1) Pour une utilisation globale, nous définissons directement activateCookieValidation sur true dans le fichier de configuration
request => [ 'enableCookieValidation' => true, ]
Si vous ne 'pas besoin de l'utiliser Pour csrf, définissez 'enableCookieValidation' => false, mais ce n'est pas sûr, donc activateCookieValidation dans yiiwebrequest de yii2 est défini sur true par défaut, ce qui signifie que csrf est activé par défaut, nous ne pouvons donc pas non plus configurer cette valeur et activez-le par défaut.
Si vous activez csrf, car il est global, une authentification sera requise pour toute demande de publication, donc lorsque nous publions des données, nous devons configurer les données csrf pour qu'elles soient masquées dans le formulaire.
Copier le code Le code est le suivant :
Lors de la publication de données, vous devez publier cette valeur. La génération de cette valeur= Yii ::$app->request->csrfToken ?>, renvoie un csrfToken crypté.
Donc, qu'il s'agisse d'un formulaire de publication ou d'une publication ajax, la valeur de csrfToken doit être définie et elle doit être publiée lors de la soumission. Sinon, une erreur se produira et l’authentification ne réussira pas.
(2) Que dois-je faire si je ne souhaite pas utiliser la vérification CSRF dans certains contrôleurs ?
La méthode est très simple, directement définie
public $enableCsrfValidation = false ,
Parce que ce Controller hérite de yiiwebController, il sera équivalent à héritant de l'attribut activateCsrfValidation, alors lors de la création d'une instance de contrôleur, la fonction CSRF sera désactivée dans ce contrôleur et la vérification ne sera pas effectuée lors de l'accès à la publication de ce contrôleur.
Par exemple, lorsque nous développons l'API, lorsque l'interface WeChat doit publier des données sur notre interface, puisque le côté WeChat ne connaît pas le csrfToken, lors de l'accès aux données de publication, s'il est activé on S'il s'agit d'un csrf global, il ne sera certainement pas accessible avec succès. Vous devez donc désactiver le csrf de cette API.
3) Que faire si vous souhaitez clôturer spécifiquement une certaine action ?
Parfois, dans certaines fonctions, nous devons désactiver la vérification CSRF dans une certaine action. Nous savons que la vérification de csrf est implémentée dans beforeAction($Action). Ensuite, nous pouvons réécrire la méthode beforeAction($action) dans le Controller
public function beforeAction($action) { $currentaction = $action->id; $novalidactions = ['dologin']; if(in_array($currentaction,$novalidactions)) { $action->controller->enableCsrfValidation = false; } parent::beforeAction($action); return true; }
Le paramètre. $action transmis est l'objet instancié par le contrôleur pour cet accès. Il contient de nombreuses informations, que vous pouvez imprimer et voir.
Exécutez d'abord $action->id pour obtenir le nom de l'action de l'accès actuel. Et $novalidactions est un tableau qui contient les noms d'action. Ces actions sont toutes les opérations dont vous avez besoin pour désactiver l'authentification CSRF (opérations qui doivent désactiver l'authentification CSRF).
Si l'action actuellement accédée se trouve dans ce $novalidactions. Si c'est le cas, cela signifie que cette action doit désactiver la fonction csrf, alors définissez l'instance du contrôleur sur
$action->controller->enableCsrfValidation = false
Ensuite, exécutez parent::beforeAction($action). À ce stade, l'enableCsrfValidation de l'instance du contrôleur dans l'$action entrante est devenue false.
Doit retourner true à la fin, sinon l'opération d'action ne sera pas exécutée.
(4) Que faire s'il est partiellement allumé ?
Premier paramètre
request => [ 'enableCookieValidation' => false, ]
dans le fichier de configuration pour ne pas utiliser csrf globalement.
(a) Pour l'allumer dans le contrôleur, réglez simplement
public $enableCsrfValidation = true
et l'ensemble du contrôleur s'allumera
(b) Pour activer
public function beforeAction($action) { $currentaction = $action->id; $accessactions = ['dologin']; i f(in_array($currentaction,$accessactions)) { $action->controller->enableCsrfValidation = true; } parent::beforeAction($action); return true; }
$accessactions est le nom de l'action qui doit activer csrf, et $action->controller sera défini ->enableCsrfValidation = true, csrf peut être activé pour l'opération en cours.
Recommandations associées :
Explication détaillée du commutateur local de yii2 csrf
Résolution de l'erreur 400 après activer CSRf
Défense Yii2.0 contre les attaques CSRF
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!