Yii CSRF禁用行动

时间:2013-05-29 07:17:18

标签: php yii csrf

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

示例:

登录表单:

  • 位置1:主页example.com

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

  • 位置3:gate.example.com

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

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

我该怎么做?

我认为csrf cookie不是跨域名!

8 个答案:

答案 0 :(得分:28)

CSRF验证发生在加载网页的早期阶段,甚至在调用控制器之前。您想要覆盖CHttpRequest类,告诉它忽略某些路由。

在名为protected/components的{​​{1}}文件夹中创建一个文件,并添加以下内容。

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

答案 1 :(得分:8)

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

public function beforeAction($action) {
    $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}

答案 2 :(得分:4)

顾名思义,它是跨站点请求伪造,所以不是它不是跨域,必须不是:)

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

Yii::app()->request->enableCsrfValidation = false;

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

答案 3 :(得分:2)

从控制器禁用CSRF:

class MyController extends Controller
{

    public $enableCsrfValidation = false;

请参阅:https://yii2-cookbook.readthedocs.io/csrf/#disabling-csrf-protection

答案 4 :(得分:1)

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

public function beforeAction($action)
{
    Yii::app()->request->enableCsrfValidation = false;
    return parent::beforeAction($action);
}

答案 5 :(得分:1)

这是另一种禁用某些操作的方法

public function beforeAction($action)
{
    Yii::$app->request->enableCsrfValidation = $action->id !== 'index'; //action name to disable CSRF for
    return parent::beforeAction($action);
}

答案 6 :(得分:0)

要禁用csrf,请在main.php中添加此内容

return array(
'components'=>array(
    'request'=>array(
        'enableCsrfValidation'=>false,
    ),
),
);

答案 7 :(得分:0)

我这样做与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=Yii::app()->getUrlManager()->parseUrl($this);函数中获取normalizeRequest()的网址。