web-dev-qa-db-fra.com

Désactiver la validation CSRF pour des actions individuelles dans Yii2

Existe-t-il un moyen de désactiver la validation CSRF pour certaines actions du contrôleur en la maintenant activée pour les autres?

Dans mon cas, j'ai plusieurs classes d'action configurables, destinées à être injectées dans les contrôleurs. Je ne peux pas transmettre le jeton de validation csrf à la demande AJAX car je travaille avec un plug-in externe (fabriqué par moi-même) WYSIWYG à l'interface frontale. Oui, je peux toujours désactiver csrf validation de l’ensemble du contrôleur à l’aide de ces actions, mais il se peut qu’elle ne soit pas sécurisée.

39
coderlex

Pour les actions/contrôleurs spécifiques, vous pouvez désactiver la validation CSRF de la manière suivante:

use Yii;

...

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

Ou à l'intérieur d'un contrôleur:

$this->enableCsrfValidation = false;

Jetez un oeil à $ enableCsrfValidation propriété de yii\web\Controller .

Mise à jour:

Voici quelques spécifications.

Si vous souhaitez désactiver la validation CSRF pour des actions individuelles, vous devez le faire dans le gestionnaire d'événements beforeAction, car le jeton CSRF est vérifié avant l'exécution de l'action (dans beforeAction de yii\web\Controller).

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

    return parent::beforeAction($action);
}

Documents officiels:

80
arogachev

Placez ceci dans votre contrôleur, remplacez simplement index par l’action que vous souhaitez désactiver csrf on.

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

j'ai essayé cela et cela a fonctionné.

Allez sur le contrôleur spécifique et écrivez cela en haut.

public $enableCsrfValidation = false;
4
Shuhad zaman

Pour moi c'est ce qui a fonctionné

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