web-dev-qa-db-ja.com

Yii2の個々のアクションのCSRF検証を無効にします

コントローラの一部のアクションに対してCSRF検証を無効にし、他のアクションに対して有効にする方法はありますか?

私の場合、コントローラーに注入することを目的としたいくつかの構成可能なActionクラスがあります。 csrf検証トークンをAJAXリクエストに渡すことはできませんこれらのアクションを使用してコントローラー全体を検証しますが、安全でない可能性があります。

39
coderlex

特定のコントローラー/アクションに対して、次のようにCSRF検証を無効にできます。

use Yii;

...

Yii::$app->controller->enableCsrfValidation = false;

またはコントローラー内:

$this->enableCsrfValidation = false;

$ enableCsrfValidationyii\web\Controller のプロパティを見てください。

更新:

以下にいくつかの仕様を示します。

個々のアクションのCSRF検証を無効にする場合は、beforeActionイベントハンドラーで実行する必要があります。アクションが実行される前にCSRFトークンがチェックされるためです(yii\web\ControllerbeforeAction) 。

/**
 * @inheritdoc
 */
public function beforeAction($action)
{            
    if ($action->id == 'my-method') {
        $this->enableCsrfValidation = false;
    }

    return parent::beforeAction($action);
}

公式ドキュメント:

80
arogachev

これをコントローラーに入れ、インデックスをcsrf onを無効にするアクションに置き換えます。

public function beforeAction()
{      
    if ($this->action->id == 'index') {
        $this->enableCsrfValidation = false;
    }
    return true;
}
5

私はこれを試しましたが、うまくいきました。

特定のコントローラーに移動して、これを上部に記述します。

public $enableCsrfValidation = false;
4
Shuhad zaman

私にとってこれはうまくいったものです

public function beforeAction($action) {
    if($action->id == 'my-action') {
        Yii::$app->request->enableCsrfValidation = false;
    }
    return parent::beforeAction($action);
}
3