跨站請求偽造 (Cross-Site Request Forgery, CSRF) 是一種常見的 Web 安全漏洞,它誘騙使用者在他們已經登入的網站上,執行非自願的惡意操作。
什麼是 CSRF 攻擊?
CSRF 的核心概念是「偽造請求」。攻擊者會建立一個惡意網站或一封釣魚郵件,其中包含一個指向目標網站(例如銀行、社交媒體)的連結或表單。當已經登入目標網站的使用者點擊這個連結時,他們的瀏覽器會自動帶上已驗證的 Cookie,向目標網站發送一個看似合法的請求,從而執行攻擊者預設好的操作。
簡單來說,攻擊利用了網站對使用者瀏覽器的信任。
攻擊原理與範例
一個典型的 CSRF 攻擊場景如下:
- 使用者登入:小明登入了他的網路銀行
bank.com
,瀏覽器保存了bank.com
的登入 Session Cookie。 - 使用者造訪惡意網站:小明在未登出銀行的情況下,點開了一個攻擊者製作的網站
evil.com
。 - 觸發惡意請求:
evil.com
網站上可能有一個圖片連結,但其src
屬性指向的並不是圖片,而是一個銀行轉帳的 URL,例如:1
<img src="http://bank.com/transfer?to=attacker&amount=10000" width="1" height="1" />
- 請求被執行:小明的瀏覽器看到這個
<img>
標籤後,會自動向bank.com
發送 GET 請求。因為這個請求是發往bank.com
的,瀏覽器會自動附上之前儲存的登入 Cookie。 - 攻擊成功:銀行伺服器收到請求後,驗證了 Cookie,認為這是小明本人發出的合法請求,因此執行了轉帳操作,將一萬塊轉給了攻擊者。
風險與影響
成功的 CSRF 攻擊,其後果取決於受害者在目標應用程式中的權限。攻擊者可以:
- 更改使用者的密碼或電子郵件地址。
- 在購物網站下訂單、轉移資金。
- 在社交媒體上以受害者的名義發布貼文或訊息。
- 執行任何該使用者有權限進行的狀態變更操作。
防禦與預防措施
防禦 CSRF 的核心思想是:確保關鍵操作確實由使用者本人發起。
1. 使用 Anti-CSRF Token (同步權杖模式)
這是最常用且最有效的防禦方法。
- 原理:當使用者訪問表單頁面時,伺服器會生成一個獨一無二、不可預測的隨機權杖 (Token),並將其嵌入表單的隱藏欄位中。
- 驗證:當使用者提交表單時,這個 Token 會跟隨請求一起發送到伺服器。伺服器會驗證收到的 Token 是否與先前發放的相符。
- 效果:攻擊者無法得知這個隨機 Token,因此他們偽造的請求中將不包含或包含錯誤的 Token,伺服器便會拒絕該請求。
2. 驗證 SameSite
Cookie 屬性
可以為網站的 Cookie 設置 SameSite
屬性,告訴瀏覽器在跨站請求中是否應該發送這個 Cookie。
SameSite=Strict
: 最嚴格,完全禁止第三方網站發起請求時攜帶 Cookie。SameSite=Lax
: (多數瀏覽器的預設值) 允許在一些頂層導航(如點擊連結)的 GET 請求中攜帶 Cookie,但禁止在<img>
、<iframe>
或 POST 表單等情境中發送。SameSite=None
: 允許在任何跨站請求中發送 Cookie,但必須同時設定Secure
屬性 (僅限 HTTPS)。
3. 實施二次驗證
對於極度敏感的操作(如轉帳、更改密碼),要求使用者重新輸入密碼、或提供一次性密碼 (OTP)、CAPTCHA 等,作為額外的安全確認。
說些什麼吧!