Yii2 关闭和打开csrf 验证
CSRF即Cross-site request forgery跨站请求伪造,是指有人冒充你的身份进行一些恶意操作。
比如你登录了网站A,网站A在你的电脑设置了cookie用以标识身份和状态,然后你又访问了网站B,这时候网站B就可以冒充你的身份在A网站进行操作,因为网站B在请求网站A时,浏览器会自动发送之前设置的cookie信息,让网站A误认为仍然是你在进行操作。
对于csrf的防范,一般都会放在服务器端进行,那么我们来看下Yii2中是如何进行防范的。
关于CSRF验证
- 全局关闭(不安全),所有的controller都将关闭csrf验证,如果设置成true,则将打开csrf验证。
//\config\main.php
request => [
'enableCookieValidation' => false,
]
- 控制器内关闭CSRF
public enableCsrfValidation = false ,
- 关闭至某一个action的CSRF
public function beforeAction($action) {
$currentaction = $action->id;
$novalidactions = ['dologin'];
if(in_array($currentaction,$novalidactions)) {
$action->controller->enableCsrfValidation = false;
}
parent::beforeAction($action);
return true;
}
- 开启某些action的CSRF
public $enableCsrfValidation = false;
//仅对用户新增、编辑['signup','update'],开启CSRF认证
public function beforeAction($action)
{
$currentaction = $action->id;
$accessactions = ['signup','update'];
if (in_array($currentaction, $accessactions)) {
$action->controller->enableCsrfValidation = true;
}
parent::beforeAction($action);
return true;
}
- 普通提交,form表单中加入隐藏域
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
<input name="<?= Yii::$app->request->csrfParam; ?>" type="hidden" value="<?= Yii::$app->request->csrfToken ?>">
- ajax异步提交,加入_csrf字段
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
type: 'POST',
url: url,
data: {_csrf:csrfToken},
success: success,
dataType: dataType
});
参考:
https://www.cnblogs.com/Yanger90/p/5799739.html
https://www.cnblogs.com/niuben/p/11057454.html
https://blog.csdn.net/terry_water/article/details/52221007