深入了解 CSRF
深入探討跨站請求偽造 (CSRF) 攻擊,說明其運作機制、示範範例,並詳述各種預防方法以提高網頁應用程式的安全性。
在從事網頁開發時,尤其是使用 cookies 時,經常會聽到類似「這設定有助於防止 CSRF」這樣的說法。然而,許多人對於「CSRF」這個名詞的真正涵意只有模糊的概念。
今天,我們將深入探討 CSRF(跨站請求偽造),這是一個常見的網頁安全漏洞。這將幫助我們更有效地處理與 CSRF 相關的問題。
什麼是 CSRF?
CSRF (Cross-Site Request Forgery) 是一種網頁攻擊,攻擊者會誘騙已驗證的使用者執行未預期的操作。簡單來說,這就是「駭客偽裝成使用者來執行未授權操作」。
CSRF 是如何運作的
要了解 CSRF,我們需要掌握一些關鍵概念:
瀏覽器的同源政策
同源政策是瀏覽器中的一項安全功能,它限制一個來源的文件或腳本如何與另一個來源的資源進行互動。
一個來源由協定(如 HTTP 或 HTTPS)、網域名稱和埠號組成。例如,https://example.com:443
是一個來源,而 https://demo.com:80
是另一個。
同源政策限制不同來源頁面之間的數據訪問,這意味著:
- JavaScript 無法從一個來源讀取另一個來源的 DOM
- JavaScript 無法從一個來源讀取另一個來源的 Cookie、IndexedDB 或 localStorage
- JavaScript 無法向另一個來源發送 AJAX 請求(除非使用 CORS)
但是,為了保持 Web 的開放性和互操作性(如從 CDN 加載資源或為日誌發送第三方 API 請求),同源政策不會限制跨來源網絡請求:
- 頁面可以向任意來源發送 GET 或 POST 請求(如加載圖像或提交表單)
- 任意來源的資源都可以被包括在內(如
<script>
、<img>
、<link>
、<iframe>
標籤)
自動發送 cookie 機制
自動發送 cookie 機制是瀏覽器的一項重要功能。當瀏覽器向某個網域發送請求時,會自動附加該網域的所有 cookies。這個過程是自動的,不需要任何 JavaScript 代碼或用戶交互。
這一機制使網站能夠輕鬆記住用戶的登入狀態,因為每個請求中都自動攜帶用戶的身份信息。
Bold
例如,當你登入銀行網站 (bank.com
) 並獲取身份 cookie,然後當你點擊查看對賬單時,瀏覽器會自動發現所有匹配 bank.com
的 cookies 並將其附加到對賬單請求中。銀行伺服器因此能夠從後端識別你並返回你的對賬單信息。
CSRF 攻擊步驟
-
使用者登入目標網站(如銀行網站)並獲得身份驗證 cookie。 這一步利用自動發送 cookie 機制。當銀行網站設置身份驗證 cookie 後,瀏覽器將自動把這個 cookie 附加到發送到該網站的每一個請求中。
-
未登出情況下,使用者訪問一個惡意網站。 此時,由於同源政策,惡意網站無法直接讀取或修改銀行網站的 cookie。這保護了使用者的身份信息不被直接竊取。
-
惡意網站包含一個向目標網站發出的請求(如轉賬操作)。 雖然同源政策限制跨來源訪問,但允許跨來源網絡請求,如通過
<img>
、<form>
標籤發起的請求。攻擊者利用了這個「漏洞」。 -
使用者的瀏覽器自動發送該請求,同時附帶目標網站的 cookie。 這是 CSRF 攻擊的核心。它利用了同源政策允許跨來源請求和自動發送 cookie 機制(即使由惡意網站觸發的請求,也會攜帶匹配網域的 cookie)。
-
目標網站收到請求,驗證 cookie 有效並執行操作。 伺服器無法判斷這個請求是否來自於合法的用戶行為,因為附帶的 cookie 是有效的。
CSRF 攻擊範例
讓我們用一個具體的例子說明 CSRF 攻擊是如何發生的。我們將以虛構的銀行網站 bank.com
為例。
首先,使用者訪問 https://bank.com
並登入他們的帳戶。
成功登入後,伺服器設置一個身份驗證 cookie,例如:
使用者在銀行網站上執行轉賬操作,例如將 $1000 轉賬給 Alice。這個操作可能發送出如下請求:
假設攻擊者創建了一個惡意網站 https://evil.com
,其中包含以下 HTML:
當使用者在未登出銀行帳戶的情況下點擊 https://evil.com
的連結,由於他們已登入 bank.com
,瀏覽器擁有一個有效的 session_id
cookie。
當惡意頁面加載後,它會自動提交隱藏的表單,向 https://bank.com/transfer
發送一個轉賬請求。
使用者的瀏覽器自動將 bank.com
的 cookie 附加到這個請求上。bank.com
伺服器收到請求,驗證 cookie 有效,然後執行這個未授權的轉賬操作。