14

異なるコントローラとサブドメインから同じフォーム データを送信します。しかし、あるケースでは、CSRF 検証を無効にする必要があります。

例:

ログインフォーム:

  • 場所 1: メインページ example.com

  • 場所 2: account.example.com/login

  • 場所 3:gate.example.com

また、場所 1 から場所 2 にデータを送信する場合に備えて、検証を無効にする必要があります。

使った$form = $this->beginWidget('CActiveForm',...

どうやってやるの?

csrf cookie はクロスドメインではないと思います!

4

8 に答える 8

30

CSRF 検証は、コントローラーが呼び出される前であっても、Web ページの読み込みプロセスの早い段階で行われます。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',
        ),
    ),
 )
于 2013-05-29T12:56:51.227 に答える
8

CSRF を無効にするには、次のコードをコントローラーに追加します。

public function beforeAction($action) {
    $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}
于 2014-06-20T12:36:22.877 に答える
4

名前が示すようにCross-Site-Request-Forgeryであるため、クロスドメインではなく、クロスドメインであってはなりません:)

CSRF はリクエスト コンポーネントで有効になっているため、リクエスト コンポーネントを取得して再構成するだけです。

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

おそらくアクションの最初に、どこに置くべきかよくわかりません。

于 2013-05-29T08:06:52.053 に答える
3

コントローラーから CSRF を無効にします。

class MyController extends Controller
{

    public $enableCsrfValidation = false;

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

于 2016-12-16T16:55:52.893 に答える
2

csrf を無効にするには、これを main.php に追加します。

return array(
'components'=>array(
    'request'=>array(
        'enableCsrfValidation'=>false,
    ),
),
);
于 2016-03-04T09:54:24.750 に答える
1

CSRF を無効にするには、次のコードをコントローラーに追加します。

public function beforeAction($action)
{
    Yii::app()->request->enableCsrfValidation = false;
    return parent::beforeAction($action);
}
于 2015-02-02T15:57:13.327 に答える
1

特定のアクションで無効にする別の方法を次に示します

public function beforeAction($action)
{
    Yii::$app->request->enableCsrfValidation = $action->id !== 'index'; //action name to disable CSRF for
    return parent::beforeAction($action);
}
于 2020-07-09T11:51:36.513 に答える
0

I did this slightly differently from willem-renzema 's approach.

<?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);
    }
}

Configuring it is the same as with his answer, but his method gave me errors, because it was not always possible to get the url with $url=Yii::app()->getUrlManager()->parseUrl($this); in the normalizeRequest() function.

于 2017-04-26T15:25:44.040 に答える