Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erklärung des lokalen Schalters von yii2 csrf

Detaillierte Erklärung des lokalen Schalters von yii2 csrf

*文
*文Original
2018-01-03 14:27:231628Durchsuche

In diesem Artikel wird hauptsächlich der Beispielcode zum teilweisen Schließen (Öffnen) der CSRF-Überprüfung in yii2 vorgestellt. Der Herausgeber findet es ziemlich gut, daher möchte ich es jetzt mit Ihnen teilen und als Referenz dienen. Ich hoffe, es hilft allen.

(1) Für die globale Verwendung setzen wir „enableCookieValidation“ direkt in der Konfigurationsdatei auf „true“

request => [ 
  'enableCookieValidation' => true, 
]

Wenn Sie csrf nicht verwenden müssen, legen Sie „enableCookieValidation“ fest ' => ; false, aber das ist unsicher, daher ist enableCookieValidation in yiiwebrequest standardmäßig auf true gesetzt, was bedeutet, dass csrf standardmäßig aktiviert ist, sodass wir diesen Wert auch nicht konfigurieren und standardmäßig aktivieren können.

Wenn Sie CSRF aktivieren, ist für jede Post-Anfrage eine Authentifizierung erforderlich, da es global ist. Wenn wir also Daten veröffentlichen, müssen wir die CSRF-Daten so einstellen, dass sie im Formular ausgeblendet werden.

<input type="hidden" name="_csrf" id=&#39;csrf&#39; value="<?= Yii::$app->request->csrfToken ?>">

Beim Posten von Daten müssen Sie diesen Wert posten. Die Generierung dieses Werts ist 83e0b9f8cdad4f031f9e4efdaa38d325request->csrfToken ?>, der einen verschlüsselten Wert zurückgibt csrfToken.

Ob es sich also um ein Post-Formular oder einen Ajax-Post handelt, muss der Wert von csrfToken festgelegt und beim Absenden gepostet werden. Andernfalls tritt ein Fehler auf und die Authentifizierung wird nicht bestanden.

(2) Was soll ich tun, wenn ich in einigen Controllern keine CSRF-Verifizierung verwenden möchte? Die

-Methode ist sehr einfach. Legen Sie einfach

public $enableCsrfValidation = false ,

direkt fest, da dieser Controller von yiiwebController erbt und dem Erben vom Attribut „enableCsrfValidation“ beim Erstellen entspricht Eine Controller-Instanz: Wenn dieser Controller die CSRF-Funktion deaktiviert und auf den Beitrag dieses Controllers zugreift, wird keine Überprüfung durchgeführt.

Zum Beispiel, wenn wir die API entwickeln, wenn die WeChat-Schnittstelle Daten auf unserer Schnittstelle posten muss, da die WeChat-Seite das csrfToken nicht kennt, wenn auf die Post-Daten zugegriffen wird, wenn diese aktiviert sind on Wenn es sich um ein globales CSRF handelt, ist der Zugriff definitiv nicht erfolgreich. Daher müssen Sie die CSRF dieser API deaktivieren.

3) Was ist, wenn Sie eine bestimmte Aktion gezielt schließen möchten?

Manchmal müssen wir in einigen Funktionen die CSRF-Überprüfung in einer bestimmten Aktion deaktivieren. Wir wissen, dass die Überprüfung von csrf in beforeAction($Action) implementiert ist. Als nächstes können wir die Methode beforeAction($action) im Controller neu schreiben.

public function beforeAction($action) { 
 
  $currentaction = $action->id; 
 
  $novalidactions = [&#39;dologin&#39;]; 
 
  if(in_array($currentaction,$novalidactions)) { 
 
    $action->controller->enableCsrfValidation = false; 
  } 
  parent::beforeAction($action); 
 
  return true; 
}

Der übergebene Parameter $action ist der Controller Dieses zugriffsinstanziierte Objekt enthält zahlreiche Informationen, die Sie ausdrucken und anzeigen können.

Führen Sie zuerst $action->id aus, um den Aktionsnamen des aktuellen Zugriffs zu erhalten. Und $novalidactions ist ein Array, das die Aktionsnamen enthält. Bei diesen Aktionen handelt es sich um alle Vorgänge, die Sie zum Deaktivieren der CSRF-Authentifizierung benötigen (Vorgänge, die zum Deaktivieren der CSRF-Authentifizierung erforderlich sind).

Ob sich die aktuell aufgerufene Aktion in diesen $novalidactions befindet. Wenn dies der Fall ist, bedeutet dies, dass diese Aktion die CSRF-Funktion deaktivieren muss. Stellen Sie daher die Controller-Instanz auf

$action->controller->enableCsrfValidation = false
Als nächstes führen Sie parent::beforeAction($action) aus. Zu diesem Zeitpunkt hat sich die enableCsrfValidation der in $action übergebenen Controller-Instanz in „false“ geändert.


Muss am Ende true zurückgeben, sonst wird die Aktionsoperation nicht ausgeführt.

(4) Was passiert, wenn es teilweise eingeschaltet ist?

Stellen Sie zunächst

request => [
&#39;enableCookieValidation&#39; => false,
]
in der Konfigurationsdatei ein, um csrf nicht global zu verwenden.

(a) Um es im Controller einzuschalten, stellen Sie einfach

public $enableCsrfValidation = true
ein und der gesamte Controller schaltet sich ein.

(b) Um es im zu aktivieren action

public function beforeAction($action) {
$currentaction = $action->id;
$accessactions = [&#39;dologin&#39;];
i f(in_array($currentaction,$accessactions)) {
       $action->controller->enableCsrfValidation = true;
 }

    parent::beforeAction($action);
    return true;
}
$accessactions ist der Name der Aktion, die csrf aktivieren muss. Setzen Sie $action->controller->enableCsrfValidation = true, und der aktuelle Vorgang kann csrf aktivieren.


Verwandte Empfehlungen:

Detaillierte Erläuterung, wie das Yii-Framework die Protokollierung in benutzerdefinierten Dateien implementiert

Detaillierte Erläuterung der einfachen Erweiterungsklasse des Yii-Frameworks zum Batch-Einfügen von Daten

Detaillierte Erläuterung der restful API-Autorisierungsüberprüfung von yii2

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des lokalen Schalters von yii2 csrf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn