網路安全 基礎

什麼是 CSRF 攻擊?如何防範?

AI 練習作答

什麼是 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>

設定 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 評分