2019鐵人賽
Laravel
CSRF
對於一個初學 Laravel 的人,如果要嘗試送出 POST 請求,第一個遇到的問題大部分都是 CSRF。那麼什麼是 CSRF?又該怎麼解呢?官方文件有寫解法,但是主要是針對 web 端的做法。
而我們身為一個後端工程師,測試 API 最快的方法就是使用 POSTMAN(至於 POSTMAN 怎麼用,請自己上網找吧),POSTMAN 再送請求的時候都要自己添加 header 和 body,所以在遇到 CSRF 的時候,會不知道自己要放什麼。今天就來告訴大家怎麼用 POSTMAN 來解決 CSRF 問題。
跨站請求偽造(英語:Cross-site request forgery),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF,是一種挾制用戶在當前已登錄的Web應用程式上執行非本意的操作的攻擊方法。[1] 跟跨網站指令碼(XSS)相比,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。
我節錄一個重點:
攻擊者並不能通過CSRF攻擊來直接獲取用戶的帳戶控制權,也不能直接竊取用戶的任何資訊。他們能做到的,是欺騙用戶瀏覽器,讓其以用戶的名義執行操作。
看的有點糢糊沒關係,
我舉個例子,假設阿美在自己加登入銀行執行轉賬動作,如果伺服器端因為已經確認過阿美的帳號密碼,就同意這次操作。同一時間在另外一邊,有一個壞蛋阿寶,趁著阿美還在登入狀態,也模仿一個銀行轉賬的網路請求,那麼伺服器要怎麼判定這次操作是不是阿美執行的?答案就是透過 session!
Laravel 透過應用程式自動產生一個 CSRF「token」來管理每個活躍的使用者 session。這個 token 用於驗證已認證使用者是否實際向應用程式發出請求。
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;
}
regenerateToken
實作內容,即隨機產生亂數字元。 public function regenerateToken()
{
$this->put('_token', Str::random(40));
}
恩,確實有一個名為 XSRF-TOKEN
的 token。
Web 端的解法我這裡就不再說明,官方文件已經寫的超級清楚!
我主要針對 POSTMAN 怎麼解除 CSRF 的錯誤!
未添加校驗 token,顯示的錯誤:
解決辦法:
先正常進入網站首頁,取得 token
把 token 放入 header 加入 X-XSRF-TOKEN : '剛剛的token',就可以得到我們的內容。
只是這樣每次都要重複複製 token,顯得有些麻煩,那麼我們來用用 POSTMAN 的環境變數功能
在 POSTMAN 右上角,有一個齒輪,新增一個環境
新增環境,並設定名稱
在右上角有一個下拉選單,選擇剛剛創建的環境名稱
正常進入網站首頁,接著在 Tests 中輸入以下程式,以自動取得 token
pm.environment.set(
"XSRF-TOKEN",
decodeURIComponent(pm.cookies.get("XSRF-TOKEN"))
)
完成!!