web-dev-qa-db-ja.com

Yii CSRFはアクションを無効にします

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

例:

ログインフォーム:

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

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

  • 場所3:gate.example.com

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

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

どうやってやるの?

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

14
spy-enot

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

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

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

おそらく行動の初めに、それをどこに置くべきかよくわかりません。

4
user133408

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',
        ),
    ),
 )
28
Willem Renzema

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

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

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

class MyController extends Controller
{

    public $enableCsrfValidation = false;

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

2
dCrystal

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

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

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

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

私はこれを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()を使用してURLを取得できるとは限らなかったため、彼のメソッドではエラーが発生しました。

0
FaXilifresh