Yii CSRF отключен для действий
Я отправляю те же данные формы из разных кондоллеров и поддоменов. Но в одном случае мне нужно отключить проверку CSRF.
Пример:
Форма входа:
-
Местоположение 1: главная страница example.com
-
Местоположение 2: account.example.com/login
-
Местоположение 3: gate.example.com
И мне нужно отключить проверку только в том случае, если я отправляю данные из местоположения 1 в местоположение 2.
Я использовал $form = $this->beginWidget('CActiveForm',...
Как я могу это сделать?
Я полагаю, что csrf cookie не является crossdomain!
Ответы
Ответ 1
Как следует из названия, это Cross-Site-Request-Forgery, поэтому нет, это не crossdomain и должен не быть:)
CSRF включен в компонент запроса, поэтому просто получите компонент запроса и перенастройте его:
Yii::app()->request->enableCsrfValidation = false;
Я не совсем уверен, куда его поместить, возможно, в начале действия.
Ответ 2
Проверка CSRF происходит на ранних этапах загрузки веб-страницы, даже до вызова контроллера. Вы хотите переопределить класс CHttpRequest, чтобы сообщить ему игнорировать определенные маршруты.
Создайте файл в папке protected/components
с именем HttpRequest.php
и добавьте следующее содержимое.
class HttpRequest extends CHttpRequest
{
public $noCsrfValidationRoutes=array();
protected function normalizeRequest()
{
//attach event handlers for CSRFin the parent
parent::normalizeRequest();
//remove the event handler CSRF if this is a route we want skipped
if($this->enableCsrfValidation)
{
$url=Yii::app()->getUrlManager()->parseUrl($this);
foreach($this->noCsrfValidationRoutes as $route)
{
if(strpos($url,$route)===0)
Yii::app()->detachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));
}
}
}
}
Затем отредактируйте файл конфигурации в protected/config
со следующей информацией:
// application components
'components'=>array(
....
'request' => array(
'enableCsrfValidation' => true,
'class'=>'HttpRequest',
'noCsrfValidationRoutes'=>array(
'controllername/actionname',
),
),
)
Ответ 3
Чтобы отключить CSRF, добавьте этот код к контроллеру:
public function beforeAction($action) {
$this->enableCsrfValidation = false;
return parent::beforeAction($action);
}
Ответ 4
Чтобы отключить CSRF, добавьте этот код к контроллеру:
public function beforeAction($action)
{
Yii::app()->request->enableCsrfValidation = false;
return parent::beforeAction($action);
}
Ответ 5
Чтобы отключить csrf, добавьте это в свой файл main.php
return array(
'components'=>array(
'request'=>array(
'enableCsrfValidation'=>false,
),
),
);
Ответ 6
Отключите CSRF от контроллера:
class MyController extends Controller
{
public $enableCsrfValidation = false;
Смотрите: https://yii2-cookbook.readthedocs.io/csrf/#disabling-csrf-protection
Ответ 7
Я сделал это несколько иначе, чем подход willem-renzema.
<?php
class HttpRequest extends CHttpRequest
{
public $noCsrfValidationRoutes=array();
public function validateCsrfToken($event) {
$url=Yii::app()->getUrlManager()->parseUrl($this);
foreach($this->noCsrfValidationRoutes as $route)
{
if(strpos($url,$route)===0)
return true;
}
return parent::validateCsrfToken($event);
}
}
Конфигурирование - это то же самое, что и с его ответом, но его метод дал мне ошибки, потому что не всегда возможно получить url с $url=Yii::app()->getUrlManager()->parseUrl($this);
в функции normalizeRequest()
.