iT邦幫忙

1

資安入門與實務應用介紹 14:跨站請求偽造(CSRF)原理與防護

  • 分享至 

  • xImage
  •  

另外來介紹一下CSRF(Cross-Site Request Forgery),這一種是把「受害者已登入的權限」拿來做壞事的攻擊方式。攻擊者誘導受害者在已登入的網站執行未授權的操作(像是轉帳、改密碼),而受害者根本沒注意到自己被利用。


攻擊流程(簡單示意)

  1. 使用者 A 登入銀行網站並保有有效 session cookie。
  2. A 同時開著另一個惡意網頁(攻擊者的頁面)。
  3. 惡意頁面發出一個針對銀行的請求(例如:POST /transfer),瀏覽器會自動帶上 A 的 session cookie。
  4. 銀行伺服器看到合法 cookie,就當成是 A 的操作並執行轉帳 -> 損失發生。

重點是:瀏覽器會自動帶 cookie,所以只要受害者已登入,攻擊就能利用這點。


常見防護措施(實務可用)

  • CSRF Token(伺服器端產生)

    • 每個使用者 session 產生隨機 token,嵌入表單或回傳給前端,伺服器驗證請求中的 token 是否正確。
    • 最穩、最普遍的作法,適用於傳統表單與非同源請求。
  • SameSite Cookie 屬性

    • Set-Cookie: session=...; SameSite=LaxStrict,可防止第三方網站發起跨站請求攜帶 cookie(Lax 對一般導航友好,Strict 最嚴格)。
    • 現在大多數瀏覽器支援,建議一併設定 Secure; HttpOnly
  • 檢查 Origin / Referer Header

    • 對於敏感操作(POST/PUT/DELETE),伺服器可檢查 OriginReferer 是否來自自己信任的網域。
    • 注意:某些環境下 header 可能被隱藏或省略,不能完全取代 token 機制。
  • 雙重提交 cookie(Double Submit Cookie)

    • 前端把 token 同時放在 cookie 與請求 body/header,伺服器比對兩者是否一致。實作上比單純檢查 header 更安全,但仍比不上 server-side token 綁 session。
  • 避免把敏感操作設為 GET

    • GET 應該是安全且可重複的(idempotent),所有會改變伺服器狀態的操作請用 POST/PUT/DELETE 並搭配 CSRF 防護。
  • 對 SPA 使用同源請求 + CORS + 授權 header

    • 單頁應用通常改用 token-based 認證(例如 Bearer token 存在 localStorage 或透過 Authorization header),並搭配 CORS 與檢查 Origin,減少 cookie 被濫用的風險。

開發者檢核清單(快速)

  • [ ] 敏感表單/API 是否有 CSRF token 驗證?
  • [ ] Session cookie 是否設定 SameSiteSecureHttpOnly
  • [ ] 是否避免用 GET 做會改變狀態的操作?
  • [ ] 是否對重要操作額外要求 re-authentication(再次輸入密碼)?
  • [ ] 是否在測試環境用自動化掃描器(如 OWASP ZAP)檢查 CSRF 漏洞?

小結

CSRF 利用的是「瀏覽器自動帶 cookie」的行為;最可靠的防護還是 server-side 的 CSRF token + 正確 cookie 屬性設定。把敏感操作多一道驗證或雙重確認,就能大幅降低風險。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言