yii2开启CSRF后POST"提交的数据无法被验证"

CSRF全称Cross-site request forgery,即跨站请求伪造。利用CSRF,攻击者可以破坏网络请求会话的完整性。

CSRF全称Cross-site request forgery,即跨站请求伪造。利用CSRF,攻击者可以破坏网络请求会话的完整性。比如如果在一个Web页面中存在js ajax的请求,为了网站安全,你应该仅允许这个ajax请求在当前web页面内发起。否则的话,用户可以通过模拟该ajax请求的方式发起攻击。

防御CSRF攻击的方式主要有验证token,Referer,header等。yii2框架采用的验证token的方式,当开启CSRF校验之后,会在Web请求Cookie中生成CSRF token信息。

yii2中开启CSRF校验

yii2中默认开启了CSRF校验,如果全局关闭后,可以在指定Controller中开启:

public $enableCsrfValidation = true;

您提交的数据无法被验证

开启CSRF校验后,很可能在ajax的POST请求中出现“400错误:您提交的数据无法被验证”,可以通过以下方式处理。

1,使用ActiveForm包裹输入组件

<?php $form = ActiveForm::begin(['id' => 'search-form']); ?>
//...
<?php ActiveForm::end(); ?>

2,直接在ajax请求中添加_csrf参数

var csrf = '<?=Yii::$app->request->getCsrfToken()?>'
$.ajax({
  type: 'POST',
  url: url,
  data: {_csrf: csrf}
  ...
})

关闭Cookie后,CSRF验证将失效

由于yii2的CSRF验证机制需要依赖Cookie,如果用户浏览器关闭Cookie,则功能失效。目前没有很好的方式处理这种问题。

其它文章

yii2 项目安装及升级
部署PHP WEB服务时遇到的问题