この記事では主にyii2のCSRF検証を部分的にクローズ(オープン)するサンプルコードを紹介します。編集者がとても良いと思ったので、参考として共有したいと思います。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
(1) グローバルに使用する場合は、設定ファイルで直接enableCookieValidationをtrueに設定します
request => [ 'enableCookieValidation' => true, ]
csrfを使用する必要がない場合は、'enableCookieValidation' => falseに設定しますが、これは安全ではないため、 yii2 の yiiwebrequest のenableCookieValidation はデフォルトで true に設定されており、これは csrf がデフォルトで有効であることを意味するため、この値を設定してデフォルトで有効にすることもできません。
csrf を有効にすると、グローバルであるため、投稿リクエストに認証が必要になるため、データを投稿するときに、csrf データがフォームで非表示になるように設定する必要があります。
コードをコピー コードは次のとおりです:
データを投稿するときは、この値を投稿する必要があります。この値の生成は = Yii::$app->request->csrfToken ?> であり、返されます。暗号化された csrfToken。
そのため、投稿フォームであっても、ajax 投稿であっても、csrfToken の値を設定する必要があり、送信時に投稿する必要があります。そうでない場合は、エラーが発生し、認証が通過しません。
(2) 一部のコントローラーで CSRF 検証を使用したくない場合はどうすればよいですか?
方法は非常に簡単で、直接設定します
public $enableCsrfValidation = false ,
このControllerはyiiwebControllerから継承しているため、enableCsrfValidation属性から継承していることと同等となり、コントローラインスタンス作成時にcsrf機能がオフになりますこのコントローラーでは、このコントローラーの post メソッドにアクセスする場合、検証は実行されません。
たとえば、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) 部分的にオンになっている場合はどうなりますか?
まず、設定ファイルで
request => [ 'enableCookieValidation' => false, ]
をグローバルで csrf を使用しないように設定します。
(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 を有効にできます。
関連する推奨事項:
以上がyii2 で CSRF 検証を部分的にオンまたはオフにするコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。