yii2中无论是用测试工具POSTMAN、用命令行CURL请求、ajax请求总是会得到http400:Bad Request的错误;而如果用Web网页方式GET访问(去除verbFilter的POST限制),是正常的
通过查阅资料发现,这是CRSF验证的原因
原理:
Cookie Hashing, 让服务器发送给客户端的所有表单中都标示一个随机值_csrf,并同时在客户端的COOKIE中保存一个相关联的token;
验证的时候,服务端每次对接收到的请求_POST()过来的一个input hidden _csrf跟客户端的COOKIE中的token进行对照验证
攻击者攻击的原理是利用了客户端的COOKIE,但是攻击者是得不到COOKIE具体的内容的,他只是利用(这里抛开XSS攻击的可能性,由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,这就另外的1%。一般的攻击者看到有需要算Hash值,基本都会放弃了);所以攻击者没法在攻击URL中加入token,这样就无法通过验证。
这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了
解决方案:
1.禁用CRSF验证(不推荐):'enableCsrfValidation' => false,
1
2
3
4
5
6
|
'components'
=> [
'request'
=> [
'cookieValidationKey'
=>
'83r5HbITBiMfmiYPOZFdL-raVp4O1VV4'
,
'enableCookieValidation'
=> false,
'enableCsrfValidation'
=> false,
]
|
2.数据提交时,携带 csrf 信息
a.调用组件ActiveForm时,提交数据会自动带上_csrf
b.ajax提交时可以在头部获取到csrf信息(如下图),与要提交的数据一并提交即可
c.也可以通过php获取csrf信息
1
2
|
Yii::
$app
->request->csrfParam;(获取csrf-param)
Yii::
$app
->request->csrfToken;(获取csrf-token)
|