1. 攻擊手段
利用使用者已經登入過A系統之後,在B系統上偽造請求去做壞事情。比如影片中舉的例子轉帳金額跟對象參數偽造。
CSRF 就是在不同的 domain 底下卻能夠偽造出「使用者本人發出的 request」。要達成這件事也很簡單,因為瀏覽器的機制,你只要發送 request 給某個網域,就會把關聯的 cookie 一起帶上去。如果使用者是登入狀態,那這個 request 就理所當然包含了他的資訊(例如說 session id),這 request 看起來就像是使用者本人發出的。
2. 防禦手段
- 儘量使用POST
- 加入驗證碼(比如圖形驗證碼、滑塊驗證、簡訊驗證碼)
- 檢驗HTTP Referer(確認是否從允許的網站過來的請求)
- Anti CSRF Token
2.1. 方法一
* 在form表單隱藏token 或者是在 head 的 meta attribute
1
<meta name="csrf-token" content="GBU1HKZpy3N2grxxoR..."
* 後端檢驗時確認是否是存在的token(可以放在資料庫比對或在session上記錄)
2.2. 方法二
利用framework 提供的內鍵library,比如PHP CodeIgniter 本身就有
5. 加入自定義 Header
這個概念我覺得應該跟平常在設計JWT或WEB API時考量資安問題的方式一樣