我从不同的控制器和子域发送相同的表单数据.但在一种情况下,我需要禁用CSRF验证.
例:
登录表格:
位置1:主页example.com
位置2:account.example.com/login
地点3: gate.example.com
我需要禁用验证,以防我将数据从位置1发送到位置2.
我用了 $form = $this->beginWidget('CActiveForm',...
我怎样才能做到这一点?
我认为csrf cookie不是跨域的!
Wil*_*ema 28
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'));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,protected/config使用以下信息编辑配置文件:
// application components
'components'=>array(
....
'request' => array(
'enableCsrfValidation' => true,
'class'=>'HttpRequest',
'noCsrfValidationRoutes'=>array(
'controllername/actionname',
),
),
)
Run Code Online (Sandbox Code Playgroud)
要禁用CSRF,请将此代码添加到控制器:
public function beforeAction($action) {
$this->enableCsrfValidation = false;
return parent::beforeAction($action);
}
Run Code Online (Sandbox Code Playgroud)
小智 4
顾名思义,它是Cross-Site-Request-Forgery,所以它不是跨域,也不能是:)
CSRF 在请求组件中启用,因此只需获取请求组件并重新配置它:
Yii::app()->request->enableCsrfValidation = false;
Run Code Online (Sandbox Code Playgroud)
我不太确定该把它放在哪里,可能是在行动开始时。
| 归档时间: |
|
| 查看次数: |
18078 次 |
| 最近记录: |