網路安全 基礎
什麼是 CSRF 攻擊?如何防範?
什麼是 CSRF?
CSRF(Cross-Site Request Forgery,跨站請求偽造) 是指攻擊者誘導已登入的使用者,在不知情的情況下,對目標網站發送帶有使用者憑證(Cookie)的惡意請求,讓伺服器誤以為是使用者本人操作。
攻擊原理
1. 使用者登入 bank.com,瀏覽器儲存了 session cookie
2. 使用者被誘導前往 evil.com
3. evil.com 的頁面自動發送請求到 bank.com/transfer?to=attacker&amount=10000
4. 瀏覽器自動附帶 bank.com 的 cookie
5. 伺服器誤以為是使用者本人操作,完成轉帳
<!-- evil.com 裡的惡意表單(自動提交) -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker" />
<input type="hidden" name="amount" value="10000" />
</form>
<script>document.forms[0].submit()</script>
CSRF vs XSS 差異
| XSS | CSRF | |
|---|---|---|
| 攻擊方式 | 注入惡意腳本 | 偽造合法請求 |
| 利用的漏洞 | 網站信任使用者的輸入 | 瀏覽器自動帶 Cookie |
| 目標 | 竊取資訊 | 執行未授權操作 |
防範方式
1. CSRF Token(最主流)
伺服器為每個 Session 產生隨機 Token,嵌入表單中,每次請求必須帶上,且驗證是否與伺服器端一致:
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="a1b2c3d4e5..." />
<!-- 其他欄位 -->
</form>
2. SameSite Cookie
設定 Cookie 的 SameSite 屬性,限制跨站請求時不自動攜帶 Cookie:
Set-Cookie: session=abc; SameSite=Strict; Secure; HttpOnly
| 值 | 說明 |
|---|---|
Strict |
完全禁止跨站帶 Cookie |
Lax(預設) |
允許 GET 跨站,禁止 POST |
None |
允許跨站(需搭配 Secure) |
3. 驗證 Referer / Origin Header
檢查請求來源是否為合法網域:
// 後端驗證
if (req.headers.origin !== 'https://bank.com') {
return res.status(403).json({ error: 'Forbidden' })
}
4. 敏感操作加入二次驗證
如轉帳、修改密碼等操作,加入驗證碼或重新輸入密碼確認。
✦ AI 模擬面試
輸入你的答案,AI 即時分析精準度與改進空間
登入後即可使用 AI 評分
