CSRF (跨站請求偽造) 攻擊的原理與防範
什麼是 CSRF?
CSRF (Cross-Site Request Forgery),全名為跨站請求偽造,是一種常見的網站安全漏洞。攻擊者可以利用這個漏洞,誘騙使用者在不知情的情況下,發送一個他們不想要的請求到您的網站,例如修改密碼、轉帳等。
CSRF 的攻擊原理
CSRF 的攻擊原理是,當使用者登入您的網站後,瀏覽器會儲存您的網站的 cookie。如果使用者在同一個瀏覽器中,又開啟了另一個惡意網站,惡意網站就可以在使用者不知情的情況下,向您的網站發送一個偽造的請求。因為這個請求會帶上使用者瀏覽器中儲存的 cookie,所以您的網站會以為這個請求是來自於使用者本人,從而執行了惡意的操作。
CSRF 的防範方法
防範 CSRF 的最好方法是使用 CSRF Token。
CSRF Token 是一個由伺服器端產生,並儲存在使用者 session 中的隨機字串。當使用者要發送一個請求時,伺服器端會將這個 CSRF Token 放在表單的一個隱藏欄位中。當使用者提交表單時,瀏覽器會將這個 CSRF Token 一併送回伺服器端。伺服器端會比對使用者送回來的 CSRF Token 和儲存在 session 中的 CSRF Token 是否一致,如果一致,才會執行這個請求。
PHP 範例:
-
在表單中加入 CSRF Token:
<?php session_start(); $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); ?> <form action="/transfer" method="post"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <input type="text" name="amount"> <input type="submit" value="Transfer"> </form>
-
在伺服器端驗證 CSRF Token:
<?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF token validation failed'); } // ... 處理轉帳邏輯 }