1、什麼是CSRF攻擊? CSRF是跨站請求偽造(Cross-site request forgery)的英文縮寫\ Laravel框架中避免CSRF攻擊很簡單:Laravel自動為每個用戶Session生成了一個CSRF Token,該Token可用於驗證登錄用戶和發起請求者是否是同一人,如果不是 ...
1、什麼是CSRF攻擊?
CSRF是跨站請求偽造(Cross-site request forgery)的英文縮寫\
Laravel框架中避免CSRF攻擊很簡單:Laravel自動為每個用戶Session生成了一個CSRF Token,該Token可用於驗證登錄用戶和發起請求者是否是同一人,如果不是則請求失敗。【該原理和驗證碼的原理是一致】
Laravel提供了一個全局幫助函數csrf_token來獲取該Token值,因此只需在視圖提交表單中添加如下HTML代碼即可在請求中帶上Token:
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
2.Laravel中如何避免CSRF攻擊
Laravel框架是預設開啟了csrf認證的(必須)。
可以在表單中添加一個隱藏域:
{{csrf_token()}}:表示直接輸出token值;
{{csrf_field()}}:表示的是直接輸出整個隱藏域的input框;
場景選擇:一般在視圖裡用csrf_field即可,大部分的時候在JavaScript代碼段中(特別是在做ajax非同步提交的時候)可以考慮用csrf_token。
CSRF驗證機制與圖形驗證碼的原理是一致的,都是將用戶提交的值與與session中的值進行比對,如果一致則通過,否則不通過。
針對csrf_token與csrf_field的選擇問題:
如果只需要使用值(例如,在ajax的post提交的時候),則使用csrf_token,如果需要的是隱藏域(在表單里),則使用csrf_field。
3、從CSRF驗證中排除例外路由
並不是所有請求都需要避免CSRF攻擊,比如去第三方API獲取數據的請求。
可以通過在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中間件中將要排除的請求URL添加到$except屬性數組中: