Maison >développement back-end >tutoriel php >Explication détaillée du commutateur local de yii2 csrf
Cet article présente principalement l'exemple de code pour la vérification csrf de fermeture (ouverture) partielle 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. J'espère que cela aide 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 n'avez pas besoin d'utiliser 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 l'activer 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.
<input type="hidden" name="_csrf" id='csrf' value="<?= Yii::$app->request->csrfToken ?>">
Lors de la publication de données, vous devez publier cette valeur. La génération de cette valeur est 83e0b9f8cdad4f031f9e4efdaa38d325request->csrfToken ?>, qui renvoie un crypté. csrfToken.
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, il suffit de définir
public $enableCsrfValidation = false ,
directement car ce Controller hérite de yiiwebController et sera équivalent à hériter de l'attribut activateCsrfValidation, puis lors de la création une instance de contrôleur, lorsque ce contrôleur désactive la fonction CSRF, et lors de l'accès au poste de ce contrôleur, la vérification ne sera pas effectuée.
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 contrôleur
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 correspond à ce qu'est le contrôleur. ciblage. Cet objet instancié d’accès 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 de contrôleur dans $action transmise 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é ?
Définissez d'abord
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 tout le contrôleur s'allumera
(b) Pour l'allumer dans le action
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. Définissez $action->controller->enableCsrfValidation = true, et l'opération en cours peut activer csrf.
Recommandations associées :
Explication détaillée de la vérification de l'autorisation de l'API restful de yii2
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!