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

默认会增加一个隐藏的 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

版权信息:本文为 kanchuan.com 原创,转载时请明确注明本文链接。

相关文章:

PHP json_encode UTF-8 中文编码问题
部署PHP WEB服务时遇到的问题
Yii2 项目安装及升级
macOS升级PHP7及Apache错误排查笔记

发表留言

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