ホームページ > バックエンド開発 > PHPチュートリアル > yii2 csrfのローカルスイッチの詳細説明

yii2 csrfのローカルスイッチの詳細説明

*文
リリース: 2023-03-19 07:54:01
オリジナル
1654 人が閲覧しました

この記事では主にyii2でCSRF検証を部分的にクローズ(オープン)するサンプルコードを紹介します。編集者がとても良いと思ったので、参考として共有したいと思います。お役に立てれば幸いです。

(1) グローバルに使用する場合は、設定ファイルで直接enableCookieValidationをtrueに設定します

request => [ 
  'enableCookieValidation' => true, 
]
ログイン後にコピー

csrfを使用する必要がない場合は、'enableCookieValidation' => falseを設定しますが、これは安全ではないため、yii2のyiiwebrequest EnableCookieValidation はデフォルトで true に設定されています。これは、csrf がデフォルトで有効であることを意味するため、この値を構成してデフォルトで有効にすることもできません。

csrf を有効にすると、グローバルであるため、投稿リクエストに認証が必要になるため、データを投稿するときに、csrf データがフォームで非表示になるように設定する必要があります。

<input type="hidden" name="_csrf" id=&#39;csrf&#39; value="<?= Yii::$app->request->csrfToken ?>">
ログイン後にコピー

データを投稿するときは、この値を投稿する必要があります。生成される値は 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 = [&#39;dologin&#39;]; 
 
  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 => [
&#39;enableCookieValidation&#39; => false,
]
ログイン後にコピー

を設定します。

(a) コントローラーで有効にするには、

public $enableCsrfValidation = true
ログイン後にコピー

を設定するだけで、コントローラー全体が有効になります

(b) アクションで有効にするには、

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 はアクションの名前ですCSRF を有効にする必要があります。$action->controller->enableCsrfValidation = true に設定すると、現在の操作で csrf を有効にできます。関連する推奨事項: YII フレームワークがカスタム ファイルへの記録ログを実現する方法の詳細な説明

YII フレームワークのバッチ データの簡単な拡張の詳細な説明 認可の検証

以上がyii2 csrfのローカルスイッチの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート