異なるコントローラーとサブドメインから同じフォームデータを送信します。しかし、ある場合には、CSRF検証を無効にする必要があります。
例:
ログインフォーム:
場所1:メインページexample.com
場所2:account.example.com/login
場所3:gate.example.com
また、ロケーション1からロケーション2にデータを送信する場合に備えて、検証を無効にする必要があります。
使用した$form = $this->beginWidget('CActiveForm',...
どうやってやるの?
Csrf cookieはクロスドメインではないと思います!
名前が示すように、それはCross-Site-Request-Forgeryであるため、クロスドメインではなく、必須ではありません: )
CSRFはリクエストコンポーネントで有効になっているため、リクエストコンポーネントを取得して再構成するだけです。
Yii::app()->request->enableCsrfValidation = false;
おそらく行動の初めに、それをどこに置くべきかよくわかりません。
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',
),
),
)
CSRFを無効にするには、次のコードをコントローラーに追加します。
public function beforeAction($action) {
$this->enableCsrfValidation = false;
return parent::beforeAction($action);
}
コントローラからCSRFを無効にします。
class MyController extends Controller
{
public $enableCsrfValidation = false;
参照: https://yii2-cookbook.readthedocs.io/csrf/#disabling-csrf-protection
Csrfを無効にするには、これをmain.phpに追加します
return array(
'components'=>array(
'request'=>array(
'enableCsrfValidation'=>false,
),
),
);
CSRFを無効にするには、次のコードをコントローラーに追加します。
public function beforeAction($action)
{
Yii::app()->request->enableCsrfValidation = false;
return parent::beforeAction($action);
}
私はこれを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を取得できるとは限らなかったため、彼のメソッドではエラーが発生しました。