CSRF
Cross-site-Request Forgery - 跨站請求偽造
又被稱為 one-click attack 或 session riding。
一般驗證只能保證請求發自某個用戶的瀏覽器,但不能保證請求本身是用戶自願發出的。
在使用者登入帳號(已完成基礎身份驗證) 且 不知情的情況下,利用受害者的身份進行請求。
發生情境
常發生在瀏覽器已經驗證過,像是曾經紀錄 cookie 或者未登出,
在這時候,使用者不小心點了攻擊者提供的包含了目標 domain 的連結與想攜帶的參數,
讓攻擊者假借使用者的名義,去執行該網站的操作,造成伺服器誤會,而遺失重要資料。
預防的方式
基本防護
操作與個人資訊相關的CRUD,使用 POST 操作。
<form> 仍可能被自動submit。
避免設置 Access-Control-Allow-Origin = *。
加上圖形驗證碼、簡訊驗證碼。
使用 CSRF Token,產生時保存在伺服器端,送出時再進行驗證。
若server 支持 origin 的請求,就有可能被攻擊。
變形 - 客戶端驗證:改由在客戶端產 Token,後面步驟相同,可能使用場景:SPA。
Double submit cookie
伺服端產生 CSRF Token,放在 cookie 與 <form> 中,當按下 submit 時,伺服器端再進行驗證,同時比對兩個 domain 是否相等。
優點:可驗證請求是否為同一個 domain 來的。
若攻擊者掌握了 sub-domain,還是有可能會被攻擊。
Cookie SameSite
瀏覽器的防禦,可以在設定 cookie 時加入兩種 SameSite 模式
Strict: 嚴格模式
<a href="" />、<form/>、new XMLHttpRequest 等等。
只要不是同一個Site 就不會帶上這個cookie。
Lax: 預設,放鬆模式
送寬 <a href="" />、<link rel="prerender">、<form method="GET"> 不作限制。
仍限制 POST、PUT、DELETE方法,不是同一個 Site 就不會帶上這個cookie。
需確認瀏覽器是否支援,chrome 80 將為所有使用者帶上 Lax 默認行為。
參考資料
Last updated
Was this helpful?