启用Csrf后POST数据时出现的400错误
程序员文章站
2023-08-20 09:40:05
最近一直出现这样的错误,一直在查找原因,偶然看到一篇解决的文章,分享给大家看看。
第一种解决办法是关闭csrf
public function init(){...
最近一直出现这样的错误,一直在查找原因,偶然看到一篇解决的文章,分享给大家看看。
第一种解决办法是关闭csrf
public function init(){ $this->enablecsrfvalidation = false; }
第二种解决办法是在form表单中加入隐藏域
<input name="_csrf" type="hidden" id="_csrf" 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 });
yii这个匹配的过程和yii::$app->request->csrftoken 这个值存储位置说明:
存储位置
protected function createcsrfcookie($token) { $options = $this->csrfcookie; $options['name'] = $this->csrfparam; $options['value'] = $token; return new cookie($options); }
校验方法
public function validatecsrftoken($token = null) { $method = $this->getmethod(); // only validate csrf token on non-"safe" methods http://www.w3.org/protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 if (!$this->enablecsrfvalidation || in_array($method, ['get', 'head', 'options'], true)) { return true; } $truetoken = $this->loadcsrftoken(); if ($token !== null) { return $this->validatecsrftokeninternal($token, $truetoken); } else { return $this->validatecsrftokeninternal($this->getbodyparam($this->csrfparam), $truetoken) || $this->validatecsrftokeninternal($this->getcsrftokenfromheader(), $truetoken); } }
以上所述就是本文的全部内容了,希望大家能够喜欢。
上一篇: 生前就爱吃苹果
下一篇: 宋朝官员上朝时手里拿的板子是什么?