Yii CSRF禁用行动

spy*_*not 14 php csrf yii

我从不同的控制器和子域发送相同的表单数据.但在一种情况下,我需要禁用CSRF验证.

例:

登录表格:

  • 位置1:主页example.com

  • 位置2:account.example.com/login

  • 地点3: gate.example.com

我需要禁用验证,以防我将数据从位置1发送到位置2.

我用了 $form = $this->beginWidget('CActiveForm',...

我怎样才能做到这一点?

我认为csrf cookie不是跨域的!

Wil*_*ema 28

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'));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,protected/config使用以下信息编辑配置文件:

    // application components
'components'=>array(
    ....

    'request' => array(
        'enableCsrfValidation' => true,
        'class'=>'HttpRequest',
        'noCsrfValidationRoutes'=>array(
            'controllername/actionname',
        ),
    ),
 )
Run Code Online (Sandbox Code Playgroud)


the*_*bug 8

要禁用CSRF,请将此代码添加到控制器:

public function beforeAction($action) {
    $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}
Run Code Online (Sandbox Code Playgroud)


小智 4

顾名思义,它是Cross-Site-Request-Forgery,所以它不是跨域,也不能是:)

CSRF 在请求组件中启用,因此只需获取请求组件并重新配置它:

Yii::app()->request->enableCsrfValidation = false;
Run Code Online (Sandbox Code Playgroud)

我不太确定该把它放在哪里,可能是在行动开始时。