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.
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:
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;
}
j'ai essayé cela et cela a fonctionné.
Allez sur le contrôleur spécifique et écrivez cela en haut.
public $enableCsrfValidation = false;
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);
}