この記事では主にyii2でCSRF検証を部分的にクローズ(オープン)するサンプルコードを紹介します。編集者がとても良いと思ったので、参考として共有したいと思います。お役に立てれば幸いです。
(1) グローバルに使用する場合は、設定ファイルで直接enableCookieValidationをtrueに設定します
request => [ 'enableCookieValidation' => true, ]
csrfを使用する必要がない場合は、'enableCookieValidation' => falseを設定しますが、これは安全ではないため、yii2のyiiwebrequest EnableCookieValidation はデフォルトで true に設定されています。これは、csrf がデフォルトで有効であることを意味するため、この値を構成してデフォルトで有効にすることもできません。
csrf を有効にすると、グローバルであるため、投稿リクエストに認証が必要になるため、データを投稿するときに、csrf データがフォームで非表示になるように設定する必要があります。
<input type="hidden" name="_csrf" id='csrf' value="<?= Yii::$app->request->csrfToken ?>">
データを投稿するときは、この値を投稿する必要があります。生成される値は = Yii::$app->request->csrfToken ?> であり、暗号化された csrfToken が返されます。
そのため、投稿フォームであっても、ajax 投稿であっても、csrfToken の値を設定する必要があり、送信時に投稿する必要があります。そうでない場合は、エラーが発生し、認証が通過しません。
(2) 一部のコントローラーで CSRF 検証を使用したくない場合はどうすればよいですか?
方法は非常に簡単で、直接設定します
public $enableCsrfValidation = false ,
このControllerはyiiwebControllerから継承しているので、enableCsrfValidation属性から継承することと同じになります。すると、コントローラインスタンス作成時に、このコントローラではcsrf機能がオフになります。サーバーのポストモードを使用する場合、検証は実行されません。
たとえば、APIを開発するとき、WeChatインターフェイスがインターフェイスにデータを投稿する必要があるとき、WeChatはcsrfTokenを知らないため、投稿データにアクセスするときに、グローバルcsrfがオンになっていると、間違いなく投稿データを投稿できなくなります。無事にアクセスできました。したがって、この API の csrf をオフにする必要があります。
3) 特定のアクションを具体的に閉じたい場合はどうすればよいですか?
一部の関数では、特定のアクションで csrf 検証をオフにする必要がある場合があります。 csrf の検証が beforeAction($Action) で実装されていることがわかりました。次に、Controller の beforeAction($action) メソッドを書き換えます
public function beforeAction($action) { $currentaction = $action->id; $novalidactions = ['dologin']; if(in_array($currentaction,$novalidactions)) { $action->controller->enableCsrfValidation = false; } parent::beforeAction($action); return true; }
渡されるパラメーター $action は、このアクセスのためにコントローラーによってインスタンス化されたオブジェクトです。多くの情報が含まれているので、印刷して参照してください。
まず $action->id を実行して、現在アクセスされているアクション名を取得します。 $novalidactions は、アクション名を含む配列です。これらのアクションは、CSRF 認証をオフにするために必要なすべての操作 (CSRF 認証をオフにする必要がある操作) です。
現在アクセスされているアクションがこの $novalidactions にあるかどうか。そうであれば、このアクションは csrf 関数をオフにする必要があることを意味するため、コントローラー インスタンスを
$action->controller->enableCsrfValidation = false
に設定してから、parent::beforeAction($ action) を実行します。 )、この時点で、渡された $action のコントローラー インスタンスのenableCsrfValidation が false に変更されています。
最後に true を返す必要があります。そうでない場合、アクション操作は実行されません。
(4) 部分的にオンになっている場合はどうなりますか?
まず、設定ファイルで csrf をグローバルに使用しないように
request => [ 'enableCookieValidation' => false, ]
を設定します。
(a) コントローラーで有効にするには、
public $enableCsrfValidation = true
を設定するだけで、コントローラー全体が有効になります
(b) アクションで有効にするには、
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 はアクションの名前ですCSRF を有効にする必要があります。$action->controller->enableCsrfValidation = true に設定すると、現在の操作で csrf を有効にできます。関連する推奨事項: YII フレームワークがカスタム ファイルへの記録ログを実現する方法の詳細な説明
YII フレームワークのバッチ データの簡単な拡張の詳細な説明 認可の検証
以上がyii2 csrfのローカルスイッチの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。