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值

留言板