iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
1
Software Development

新手後端工程師的學習歷程系列 第 23

Day 23 - Laravel CSRF 篇

tags: 2019鐵人賽 Laravel CSRF

前言

對於一個初學 Laravel 的人,如果要嘗試送出 POST 請求,第一個遇到的問題大部分都是 CSRF。那麼什麼是 CSRF?又該怎麼解呢?官方文件有寫解法,但是主要是針對 web 端的做法。
而我們身為一個後端工程師,測試 API 最快的方法就是使用 POSTMAN(至於 POSTMAN 怎麼用,請自己上網找吧),POSTMAN 再送請求的時候都要自己添加 header 和 body,所以在遇到 CSRF 的時候,會不知道自己要放什麼。今天就來告訴大家怎麼用 POSTMAN 來解決 CSRF 問題。

CSRF 是什麼?

跨站請求偽造(英語:Cross-site request forgery),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF,是一種挾制用戶在當前已登錄的Web應用程式上執行非本意的操作的攻擊方法。[1] 跟跨網站指令碼(XSS)相比,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。

我節錄一個重點:
攻擊者並不能通過CSRF攻擊來直接獲取用戶的帳戶控制權,也不能直接竊取用戶的任何資訊。他們能做到的,是欺騙用戶瀏覽器,讓其以用戶的名義執行操作。

CSRF - 維基百科

看的有點糢糊沒關係,
我舉個例子,假設阿美在自己加登入銀行執行轉賬動作,如果伺服器端因為已經確認過阿美的帳號密碼,就同意這次操作。同一時間在另外一邊,有一個壞蛋阿寶,趁著阿美還在登入狀態,也模仿一個銀行轉賬的網路請求,那麼伺服器要怎麼判定這次操作是不是阿美執行的?答案就是透過 session!

Laravel 內建 CSRF token

Laravel 透過應用程式自動產生一個 CSRF「token」來管理每個活躍的使用者 session。這個 token 用於驗證已認證使用者是否實際向應用程式發出請求。

  1. 我們找到 vender/laravel/framework/src/Illuminate/Session/Store.php 這支檔案,可以知道每次進入 laravel 專案的時候,都會檢查 session 中 _token 是否存在,如果不存在就會呼叫 regenerateToken 重新生成一個 token
    public function start()
    {
        $this->loadSession();

        if (! $this->has('_token')) {
            $this->regenerateToken();
        }

        return $this->started = true;
    }
  1. regenerateToken 實作內容,即隨機產生亂數字元。
    public function regenerateToken()
    {
        $this->put('_token', Str::random(40));
    }
  1. 實際用 POSTMAN 看看伺服器是不是真的有回傳 token

恩,確實有一個名為 XSRF-TOKEN 的 token。

添加校驗 token

Web 端的解法我這裡就不再說明,官方文件已經寫的超級清楚!

我主要針對 POSTMAN 怎麼解除 CSRF 的錯誤!

未添加校驗 token,顯示的錯誤:

解決辦法:

  1. 先正常進入網站首頁,取得 token

  2. 把 token 放入 header 加入 X-XSRF-TOKEN : '剛剛的token',就可以得到我們的內容。

只是這樣每次都要重複複製 token,顯得有些麻煩,那麼我們來用用 POSTMAN 的環境變數功能

  1. 在 POSTMAN 右上角,有一個齒輪,新增一個環境

  2. 新增環境,並設定名稱

  1. 在右上角有一個下拉選單,選擇剛剛創建的環境名稱

  2. 正常進入網站首頁,接著在 Tests 中輸入以下程式,以自動取得 token

pm.environment.set(
    "XSRF-TOKEN",
    decodeURIComponent(pm.cookies.get("XSRF-TOKEN"))
)
  1. POST 方法中,header加入 X-XSRF-TOKEN:{{XSRF-TOKEN}}
  • POSTMAN 取用變數的方法是 {{變數名}}

完成!!


上一篇
Day 22 - Laravel Middleware 篇
下一篇
Day 24 - Laravel Controller 篇
系列文
新手後端工程師的學習歷程30

尚未有邦友留言

立即登入留言