CSRF 防護策略
什么是 CSRF
CSRF(“跨站請求偽造”):攻擊者通過郵件、社區發帖等方式誘導受害者進入第三方網站,并且在第三方網站中向被攻擊網站發送跨站請求;這主要是利用了受害者在被攻擊網站已經獲取的登錄憑證(cookie),且 cookie 會自動附在對特定域名的請求里的瀏覽器特性,達到冒充用戶對被攻擊的網站執行某項操作(如指定受害者的郵箱賬戶自動將所有收到的郵件都轉發到攻擊者的郵箱里)的目的。
幾種常見的攻擊類型
GET 類型的 CSRF 攻擊
GET 類型的 CSRF 攻擊非常容易實現,在<img>的 url 里構造惡意 URL 即可,用戶在任何頁面上只要加載了這個<img>,都相當于向該惡意 URL 發出了一次 GET 請求。
POST 類型的 CSRF 攻擊
這種類型的CSRF利用起來通常使用的是一個自動提交的表單:
<form action="http://bank.example/withdraw" method=POST>
<input type="hidden" name="account" value="xiaoming" />
<input type="hidden" name="amount" value="10000" />
<input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>
超鏈接類型的 CSRF 攻擊
跟上述兩種 CSRF 攻擊,超鏈接類型的 CSRF 攻擊需要誘導用戶主動點擊,所以需要一定的欺騙手段,用戶點擊超鏈接后會跳轉到攻擊者構建的一個惡意 URL 里,也相當于是執行了一次 GET 請求。
CSRF的特點
- CSRF(通常)發生在第三方域名,但如果被攻擊網站管控用戶內容不嚴格的話,也有可能被發布惡意超鏈接等,這樣防護起來就更困難了,因為 referer 是來自于本身。
- 攻擊利用受害者在被攻擊網站的登錄憑證,冒充受害者提交操作;而不是直接竊取或修改受害者的隱私數據。
防護策略
針對這兩點,我們可以專門制定防護策略,如下:
- 阻止不明外域的訪問
- 同源檢測
- Samesite Cookie
- 提交時要求附加本域才能獲取的信息
- CSRF Token / 雙重 cookie 驗證
- 在 LocalStorage 里存放登錄憑證
同源檢測
瀏覽器在發送請求的時候,會帶上origin和referer這兩個 HTTP 頭部字段,一般情況下,我們可以在收到請求的時候校驗這兩個字段是否來自可信的域名。
但是,雖然瀏覽器不允許修改origin和referer,但是有可能由于瀏覽器本身的機制,或者是攻擊者刻意隱藏,導致請求里并沒有這兩個字段的信息,對于這種情況,可以考慮攔截掉。
Samesite Cookie
cookie 有個SameSite屬性可以防 CSRF 攻擊,使用SameSite=Lax后,從別的網站提交 POST 表單或發送 ajax 請求時都不會附上 cookie ,這樣就從根本上解決 CSRF 攻擊。但這個SameSite屬性只在現代瀏覽器上生效, IE 上是不支持的。
CSRF Token
除了傳統的 cookie 以外,我們可以添加一個額外的 token 作為用戶憑證。
token 的生成
- 全局共享:每次登錄的時候生成一個隨機數寫到 cookie 里;以后每次請求接口的時候,前端就從 cookie 中取出這個隨機數作為請求參數;后端校驗的時候只需要比對接口參數和 cookie 里的值就可以了,也不需要存 session 了(分布式 session 成本較高)。這種方法被稱為“雙重 cookie”。
- 每個接口/表單獨立生成:針對每個接口/表單都生成一個獨立的 token ,“驗證碼”就屬于這種方案。在這種方案下,生成和儲存 token 的成本都比較高,建議只用于敏感接口。
雙重 cookie 驗證
所謂的雙重 cookie ,指的是在請求接口時,除了常規帶上 cookie 中的用戶憑證信息,如 session_id 外,還把 cookie 中的用戶憑證信息讀出來附在接口請求參數里;這種方案對比起 CSRF Token 方案來說,好在不需要生成額外的 token ,也同樣能夠起到防御 CSRF 攻擊的效果。
在 LocalStorage 里存放登錄憑證
CSRF 的關鍵是:cookie 是自動附在請求里的,那如果登錄憑證不是放在 cookie 而是 LocalStorage 里的話,比如使用 jwt 方案,那就從根本上破解了 CSRF 攻擊了,不過這樣的話,就需要防止 XSS 攻擊了。
避免自己的網站被利用
除了需要避免自己的網站被攻擊外,我們還需要避免自己的網站被利用來攻擊其它網站:
- 嚴格限制用戶上傳的內容,如禁止上傳 HTML 文件
- 不允許用戶直接引用外鏈的圖片
- 對于用戶發布的超鏈接,需要對瀏覽者提醒這是屬于外鏈的超鏈接
原文鏈接:https://segmentfault.com/a/1190000022984599?utm_source=sf-similar-article