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,
    ),
),
);

Ответ 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().