Laravel框架之CSRF跨站請求偽造
一、CSRF攻擊
1、什麼是CSRF攻擊
CSRF是跨站請求偽造(Cross-site request forgery)的英文縮寫,
原理圖示:
csrf在laravel框架中的使用,就是在客戶端form表單中設定一個_token表單域
同時把該表單域的值記錄給session,提交表單給伺服器後,伺服器判斷form表單中的_token與session中的_token是否一致,一致就進行正常的後續處理,否則該表單非法並捨棄之。
Laravel提供了一個全域性幫助函式csrf_token來獲取該Token值,因此只需在檢視提交表單中新增如下HTML程式碼即可在請求中帶上Token:
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
執行route/web.php路由的請求,只要請求方式為post/put/patch,都會執行csrf驗證,如果有哪個路由請求不要經過csrf校驗,就把該請求地址設定給VerifyCsrfToken 中介軟體
class VerifyCsrfToken extends BaseVerifier { /** *從CSRF驗證中排除的URL * @var array */ protected $except = [ 'stripe/*', ]; }
2、CSRF案例
注意:在 laravel中,預設情況下POST請求的路由都必須要通過令牌驗證的,也就是在post請求的表單中,都必須攜帶_token的。
(1)定義一個路由
//展示表單的路由
Route::get(‘register’,‘[email protected]’);
//接收表單的路由
Route::post(‘registerok’,‘[email protected]’);
(2)根據路由,新建一個DemoConotroller的控制器,並新增如上兩個方法
(3)建立一個register對應的檢視檔案
檢視檔案內容如下:
4)為了防止跨域提交表單,需要在表單裡面,新增一個生成令牌的標籤。
解析效果如下圖:
在使用post方式提交資料時,如果沒有token令牌,會報錯 419 或者如下圖:
要注意:{{csrf_field()}}和{{csrf_token()}}的區別
{{csrf_field()}}直接生成
{{csrf_token()}}直接生成令牌字串。
3、從CSRF驗證中排除指定URL
可以設定哪些post請求的路由,不需要令牌驗證。
並不是所有請求都需要避免CSRF攻擊,比如去第三方API獲取資料的請求。
可以通過在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中介軟體中將要排除的請求URL新增到$except屬性陣列中: