CSRF

Cross-site-Request Forgery - 跨站請求偽造

又被稱為 one-click attacksession riding

一般驗證只能保證請求發自某個用戶的瀏覽器,但不能保證請求本身是用戶自願發出的

使用者登入帳號(已完成基礎身份驗證)不知情的情況下,利用受害者的身份進行請求。

發生情境

常發生在瀏覽器已經驗證過,像是曾經紀錄 cookie 或者未登出,

在這時候,使用者不小心點了攻擊者提供的包含了目標 domain 的連結與想攜帶的參數,

讓攻擊者假借使用者的名義,去執行該網站的操作,造成伺服器誤會,而遺失重要資料。

預防的方式

基本防護

  • 操作與個人資訊相關的CRUD,使用 POST 操作。

  • 避免設置 Access-Control-Allow-Origin = *。

  • 加上圖形驗證碼、簡訊驗證碼。

  • 使用 CSRF Token,產生時保存在伺服器端,送出時再進行驗證。

  • 變形 - 客戶端驗證:改由在客戶端產 Token,後面步驟相同,可能使用場景:SPA。

伺服端產生 CSRF Token,放在 cookie 與 <form> 中,當按下 submit 時,伺服器端再進行驗證,同時比對兩個 domain 是否相等。

瀏覽器的防禦,可以在設定 cookie 時加入兩種 SameSite 模式

Strict: 嚴格模式

<a href="" />、<form/>、new XMLHttpRequest 等等。

只要不是同一個Site 就不會帶上這個cookie。

Lax: 預設,放鬆模式

送寬 <a href="" />、<link rel="prerender">、<form method="GET"> 不作限制。

仍限制 POST、PUT、DELETE方法,不是同一個 Site 就不會帶上這個cookie。

參考資料

https://tools.ietf.org/html/draft-west-first-party-cookies-07 https://www.chromium.org/updates/same-site https://blog.techbridge.cc/2017/02/25/csrf-introduction/

Last updated

Was this helpful?