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, 'components' => [ 'request' => [ 'cookieValidationKey' => '83r5HbITBiMfmiYPOZFdL-raVp4O1VV4', 'enableCookieValidation' => false, 'enableCsrfValidation' => false, ]
2.資料提交時,攜帶csrf 資訊
a.呼叫元件ActiveForm時,提交資料會自動帶上_csrf
b.ajax提交時可以在頭部取得到csrf資訊(如下圖),與要提交的資料一併提交即可
c.也可以透過php取得csrf資訊
Yii::$app->request->csrfParam;(获取csrf-param) Yii::$app->request->csrfToken;(获取csrf-token)
以上就是Yii2.0防禦csrf攻擊方法的內容,更多相關內容請關注PHP中文網(www.php.cn)!