# 什麼是 CSRF?
CSRF(Cross Site Request Forgery),翻成中文叫做跨站請求偽造。
我們可以拆成兩個名詞來理解,分別是 跨站
以及 請求偽造
。
- 跨站:是發生漏洞的地點,並不在目標網站上。通常是由有心人士開發了一個網站,並利用了你瀏覽器上的 Cookie 進行濫用。
- 請求偽造:有心人士利用你在惡意網站填的資料,進行修改,並成功請求。
簡單來說,CSRF 攻擊就是利用使用者已登入的身分,在使用者不知情的情況下執行惡意操作。
# CSRF 攻擊流程
- 使用者登入信任的網站 A,並獲得認證 Cookie
- 攻擊者誘導使用者訪問惡意網站 B
- 惡意網站 B 向網站 A 發送請求,瀏覽器自動帶上 Cookie
- 網站 A 驗證 Cookie 有效,執行了惡意操作
# 具體例子
# 銀行轉帳攻擊
假設你登入了網路銀行,這時收到一封看似無害的郵件,點擊連結後進入了惡意網站。該網站可能包含這樣的代碼:
<img src="https://bank.com/transfer?to=attacker&amount=10000" />
由於你仍處於登入狀態,瀏覽器會自動發送包含認證 Cookie 的請求,導致資金被轉移。
# 修改密碼攻擊
最危險的例子之一:修改密碼。
假設你真的很有可能在不知情的情況下,不小心在惡意網站中填寫敏感資料。
那駭客有很大機率會掌握你的密碼跟帳號,並且在你發送修改密碼的同時,將密碼修改為駭客的密碼,如此一來,你就很有可能登入不了你的帳號,因為密碼已被串改。
# 社群媒體攻擊
攻擊者可能讓你在不知情的情況下:
- 發布惡意貼文
- 刪除重要內容
- 修改個人資料
- 發送垃圾訊息給好友
# 如何防範?
首先我們得了解達成 CSRF 的必要條件:
- 有一個可以觸發腳本的網站
- 目標網站只以單一條件來驗證身分
- 驗證字符可預測或過時的加密、雜湊方式
# 身為工程師你可以…
CSRF Token
在請求任何敏感訊息時,加以驗證。如:添加隨機 Token 在表單上。
駭客就無法僅憑無 Token 的表單進行請求。html<form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="abc123xyz789"> <input type="text" name="amount"> <button type="submit">轉帳</button> </form>
檢查 Referer Header
檢查請求來源。 這樣就算駭客搭建了惡意網站,也成功發送請求,但因為不是合法的請求來源最後會被擋下來。SameSite Cookie 屬性
設定 Cookie 的 SameSite 屬性為Strict
或Lax
:javascriptSet-Cookie: sessionid=abc123; SameSite=Strict; Secure; HttpOnly
雙重送出 Cookie (Double Submit Cookie)
將 CSRF Token 同時放在 Cookie 和請求參數中,伺服器驗證兩者是否一致。自訂 Header 驗證
要求前端在 AJAX 請求中加入自訂 Header,因為跨域請求無法設定自訂 Header。
# 身為使用者你可以…
及時登出
登出。因為登出時,你的 Cookie 登入訊息會被正常的刪除。駭客也無法獲取你的 Cookie。避免同時開啟多個網站
不要在已登入重要網站的瀏覽器中隨意點擊不明連結。使用不同瀏覽器
將重要網站(如網路銀行)和一般瀏覽分開在不同瀏覽器中進行。保持瀏覽器更新
使用最新版本的瀏覽器,因為新版本通常有更好的安全防護機制。啟用雙因子驗證 (2FA)
即使 CSRF 攻擊成功,雙因子驗證也能提供額外的保護層。謹慎點擊連結
特別是來自郵件、社群媒體或不信任來源的連結。
# 檢測 CSRF 漏洞
作為開發者,你可以使用以下工具檢測 CSRF 漏洞:
- OWASP ZAP - 免費的安全測試工具
- Burp Suite - 專業的 Web 應用程式安全測試工具
- CSRFTester - 專門針對 CSRF 的測試工具
# 總結
CSRF 攻擊利用了網站對使用者瀏覽器的信任,通過社會工程學讓使用者在不知情的情況下執行惡意操作。防範 CSRF 需要從技術和使用習慣兩個層面入手:
- 技術層面:實施 CSRF Token、檢查 Referer、設定 SameSite Cookie 等
- 使用者層面:養成良好的上網習慣,及時登出,謹慎點擊連結
只有多重防護才能有效抵禦 CSRF 攻擊,保護使用者的資料安全。
留言板(尚在測試階段)
登入
還沒有帳號? 註冊