1. 程式人生 > >Laravel框架之CSRF跨站請求偽造

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:

執行route/web.php路由的請求,只要請求方式為post/put/patch,都會執行csrf驗證,如果有哪個路由請求不要經過csrf校驗,就把該請求地址設定給VerifyCsrfToken 中介軟體
<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屬性陣列中:
在這裡插入圖片描述