我从不同的控制器和子域发送相同的表单数据。但在一种情况下,我需要禁用CSRF验证。
示例:
登录表单:
位置1:主页example.com
位置2:account.example.com/login
位置3:gate.example.com
我需要禁用验证,以防我将数据从位置1发送到位置2。
我使用了$form = $this->beginWidget('CActiveForm',...
我该怎么做?
我认为csrf cookie不是跨域名!
答案 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()
的网址。