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

 原创    2019-06-16

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(); ?>

默认会增加一个隐藏的input携带csrf信息。

2,Ajax请求

最新版本的Yii2,在模版文件中通过以下方式生成csrftoken:

<?php $this->registerCsrfMetaTags() ?>

Ajax请求默认会增加X-CSRF-Token的header,不再需要在请求参数中增加csrfToken。

var csrfParam = yii.getCsrfParam()//获取csrf key
var csrfToken = yii.getCsrfToken()//获取csrf token值
文章最后修改于 2023-08-01

相关文章:

yii2 项目安装及升级
macOS升级PHP7及Apache错误排查笔记
部署PHP WEB服务时遇到的问题

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。