Yii CSRF禁用操作

yiytaume  于 2022-11-09  发布在  其他
关注(0)|答案(8)|浏览(151)

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

  • 位置1:主页example.com
  • 位置2:account.example.com/login
  • 位置3:gate.example.com

我需要禁用验证,以防从位置1向位置2发送数据。
我使用了$form = $this->beginWidget('CActiveForm',...
我怎么能那样做呢?
我认为csrf cookie不是跨域的!

vwkv1x7d

vwkv1x7d1#

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',
        ),
    ),
 )
axkjgtzd

axkjgtzd2#

要禁用CSRF,请将以下代码添加到您的控制器:

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

czq61nw13#

顾名思义,它是 * 跨站点请求伪造 *,因此它不是跨域的,而且必须不是:)
CSRF已在请求组件中启用,因此只需获取请求组件并重新配置即可:

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

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

0wi1tuuw

0wi1tuuw4#

从控制器禁用CSRF:

class MyController extends Controller
{

    public $enableCsrfValidation = false;

请访问:https://yii2-cookbook.readthedocs.io/csrf/#disabling-csrf-protection

nkcskrwz

nkcskrwz5#

要禁用csrf,请将其添加到main.php中

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

7cwmlq896#

要禁用CSRF,请将以下代码添加到您的控制器:

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

bhmjp9jg7#

下面是另一种针对某些操作禁用它的方法

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

lo8azlld8#

我的做法与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);
    }
}

配置它与他的答案相同,但他的方法给了我错误,因为在normalizeRequest()函数中,并不总是可以用$url=Yii::app()->getUrlManager()->parseUrl($this);获得url。

相关问题