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 用於驗證已認證使用者是否實際向應用程式發出請求。
我們找到
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));
實際用 POSTMAN 看看伺服器是不是真的有回傳 token