引言
CSRF 的全名是 Cross-Site Request Forgery,中文翻譯為「跨網站請求偽造」。顧名思義,這種攻擊會「偽造」使用者對網站發出的請求,而且是從其他網站跨域發動的。簡單來說,攻擊者會誘使使用者的瀏覽器在不知情的情況下,替使用者向另一個已登入的網站發出惡意請求。
舉個例子:小明是一名網路銀行用戶。某天,他先登入了網路銀行查詢餘額,接著又打開另一個網站閱讀新聞。然而,他不知道這個新聞網站中藏有攻擊者植入的惡意程式碼。該程式碼趁小明尚未登出銀行網站之際,利用他的登入狀態,偷偷向銀行發出一個轉帳請求。由於請求附帶著小明的登入憑證(例如 Cookie),銀行誤以為這是小明本人在下達指令,於是不知情地完成了轉帳。這種在使用者毫無察覺下發動的跨網站請求攻擊,就是 CSRF 攻擊。
換句話說,在上述例子中,小明並沒有真的按下轉帳的按鈕,而是攻擊者「偽造」了這個請求,借用了小明的身份驗證資訊來欺騙銀行網站完成操作。
CSRF攻擊是如何發生的?
要成功執行一次 CSRF攻擊,通常會經歷以下流程:
- 受害者已登入目標網站:攻擊者假設受害者已經在某個網站(如網路銀行或社群媒體)登入並保持有效的登入狀態(瀏覽器保有該網站的 Cookie)。
- 構造惡意請求:攻擊者為該網站準備一個惡意請求,此請求會執行某種敏感操作,例如轉帳、購物或更改密碼等。
- 引誘受害者發送請求:攻擊者透過社交工程引誘受害者在不知情下發出這個請求。例如,寄送夾帶惡意連結的電子郵件、分享看似正常的網址,或在受害者常造訪的網站中植入隱藏的請求(隱藏表單或圖片)。
- 瀏覽器代為送出請求:當受害者點擊了惡意連結或瀏覽了含惡意代碼的頁面後,瀏覽器會在背景自動向目標網站發送該請求,並附上受害者對該網站的認證憑證(如 Cookie),因為受害者當時處於已登入狀態。
- 目標網站執行請求:目標網站接收到這個看似正常的請求後,由於缺乏進一步驗證,它會將其視為合法的使用者操作並執行。網站被蒙蔽,以為這項操作是受害者本人發起的,於是完成了攻擊者設計的動作。
透過上述步驟,攻擊者便能在使用者毫無察覺的情況下達成其惡意目的。可見,充分了解 CSRF 攻擊的運作方式,有助於針對每個環節加強防護措施,降低遭受此類攻擊的風險。
CSRF token 的作用
為了防範 CSRF 攻擊,開發者常採用 CSRF token 機制。CSRF token 是由伺服器產生的一串隨機字元,用於驗證請求的合法性。當使用者開啟一個需要提交資料的表單頁面時,伺服器會產生一個隨機的 CSRF token 並將其注入頁面(通常放在隱藏欄位或 Cookie)。而當使用者提交表單時,這個 token 會隨請求一同發回伺服器。
伺服器收到請求後會檢查 CSRF token 是否有效。若 token 符合伺服器先前發出的值,即表示該請求來自合法來源,伺服器便允許繼續處理;相反地,若缺少 token 或 token 不匹配,該請求將被視為具有 CSRF 攻擊 嫌疑而遭到拒絕。也就是說,即便攻擊者誘使受害者的瀏覽器發出了偽造請求,只要沒有正確的 CSRF token,請求就會因驗證失敗被攔截。
簡而言之,CSRF token 就像網站發給用戶的一組隱藏暗號,只有從正規頁面發出的請求才握有正確暗號,攻擊者無法隨意偽造。因此,CSRF token 機制可以大幅降低 CSRF 攻擊得逞的可能性。目前主流的網站開發框架多內建了 CSRF 防護功能,方便開發者直接使用這道安全防線。
如何判斷是否遭遇 CSRF(如 csrf detected 的狀況)
對一般用戶來說,CSRF 攻擊發生時往往不容易察覺,因為整個過程都在背後進行。然而,有幾種跡象可以幫助判斷是否遭遇了 CSRF 攻擊:
- 帳戶出現未授權操作:如果您發現自己的帳戶中出現了非本人操作的異常情況,例如銀行帳戶莫名轉出了款項、社群網站發表了自己沒發過的貼文,或電子郵件發送出未曾撰寫的信件,就有可能是遭到了 CSRF 攻擊或其他類似的入侵。
- 網站的安全提示:如果網站偵測到可疑請求,可能會顯示錯誤訊息或警告。例如,網站可能跳出「CSRF detected」或「檢測到跨站請求偽造」等提示,表示該請求被認定有安全風險而遭到阻擋。這通常說明該網站的 CSRF 防禦機制已經發揮作用,成功攔截了可疑操作。
對於網站管理員或開發者而言,也可以從系統日誌中發現 CSRF 攻擊的蛛絲馬跡。比如,日誌中若出現未通過 CSRF token 驗證的請求,或者安全掃描工具報告「CSRF detected」,都意味著可能有人試圖利用 CSRF 攻擊網站。當發現這些跡象時,應立即檢查網站的 CSRF 防禦是否存在漏洞,並加以修補。
如何防止 CSRF攻擊:以使用者與開發者角度提出建議
防範 CSRF 攻擊需要網站開發者與一般用戶共同配合。以下分別從使用者與開發者的角度,提供幾項關鍵建議:
對一般使用者:
- 謹慎點擊連結:不要隨意點擊來源不明或可疑的網站連結和電子郵件附件,特別是在您已登入網銀、電商等重要帳戶的狀態下。許多 CSRF 攻擊都是透過看似無害的連結引誘您點擊而觸發的。
- 避免長時間保持登入:在使用完銀行、支付、後台管理等敏感網站後,養成主動登出的習慣。長時間保持登入將增加遭受 CSRF 攻擊的風險。使用完畢最好立即關閉該網站或至少登出帳戶,以減少被惡意請求利用的機會。
- 啟用雙重驗證:為您的帳戶(尤其是金融相關帳戶)啟用雙因素或多因素驗證。即使攻擊者透過 CSRF 發起了某些請求,若後續步驟需要額外驗證(如簡訊驗證碼或硬體憑證),攻擊也較難成功。
對網站開發者:
- 落實 CSRF token 機制:確保在網站中每個會改變使用者狀態的請求(例如提交表單、進行交易或修改設定)都實施 CSRF token 驗證。利用框架內建的 CSRF 防護功能或自行加入隨機 token,要求所有敏感請求必須攜帶正確的 token,後端在處理請求時也需驗證 token 的有效性。
- 限制請求來源:在伺服器端檢查請求的來源,例如驗證 HTTP Referer 或 Origin 標頭,以確保請求確實從可信任的網頁發出。雖然此措施並非萬無一失,但可攔截部分明顯不符來源的可疑請求。另外,設定 Cookie 的 SameSite 屬性(視需求設定為
Strict
或Lax
)也能防止大多數跨站請求攜帶使用者的認證 Cookie。 - 關鍵操作增加驗證:對特別敏感的操作(如更改密碼、轉出大額款項),要求使用者重新驗證身分(例如再次輸入密碼或提供一次性驗證碼)後才能執行。多一道驗證能確保即便使用者處於已登入狀態,也不會在毫不知情下完成高風險動作,間接降低了 CSRF 攻擊得逞的可能性。
結語
總而言之,CSRF 攻擊雖然隱蔽,卻可能帶來重大的安全風險。我們必須重視這類跨網站請求偽造的威脅,無論是一般用戶還是開發者都應保持警覺並採取適當的資安防護措施。透過前文介紹的各種方法(例如使用 CSRF token 機制、養成良好上網習慣以及啟用多重驗證等),可以大幅降低 CSRF 攻擊得逞的可能性。網路安全沒有萬無一失的解方,但只要持續強化防禦、提高自身安全意識,我們就能有效保護個人資料和系統免受 CSRF 等惡意攻擊的侵害。讓我們共同努力,打造更安全的網路環境。