CSRF Cross Site Request Forgery:跨站請求偽造
在不同 domain 底下,偽造成使用者本人發出 request
發 request 時,瀏覽器會把關聯的 cookie 帶上,如果在沒有登出的情況下點到惡意連結,可能就會在自己不知情的形況下發送 request,並把 cookie 帶過去
防禦方法--Server
核心:從 Server 防禦,擋掉從不同 domain 來的 request
檢查 Referer
執行:檢查 header 帶的 referer 是不是合法的 domain
注意:
- 有些瀏覽器不會帶 referer
- 使用者可以關閉自動帶 referer 的功能
- 驗證 domain 是否合法的 function 可能有 bug
圖形驗證、簡訊驗證
執行:接收簡訊驗證碼,可以確保不被 CSRF 攻擊
注意:驗證碼過於繁複,會影響到使用者的體驗
CSRF token
執行:由 server 自動產生 csrftoken,把 csrftoken 隱藏在 form 裡面,並存在 server 的 session 裡
注意:server 若支持 cross origin,攻擊者就可以拿到 csrftoken
Double Submit Cookie
Sever side
執行:由 server 自動產生 csrftoken,把 csrftoken 隱藏在 form 裡,並設置在 client 端的 cookie 裡
注意:攻擊者若掌握 subdoamin 就可以改寫 cookie
Client side
執行:由 client 生成 csrftoeken,一樣把 csrftoken 放在 form 裡面,並設置 cookie
防禦方法--browser
same site cookie
執行:在設置 cookie 的後面加上 SameSite
,瀏覽器驗證是否從同一個 site 發出的 request,如果不是就不會帶上 Cookie
Set-Cookie: session_id=elkjl1231kj; SameSite
可以針對要特定行為對 cookie 做 same site 的設定
ex. 購物或轉帳時才執行 same site,其餘就不用,可以讓使用者體驗更好一點
參考資料:讓我們來談談 CSRF