近期項目對漏洞修復這一塊比較看重,例舉下CSRF的修復之路吧(提到我就心累)
1、CSRF是什麼
CSRF(Cross Site Request Forgery, 跨站域請求僞造)是一種網絡的攻擊方式,它在 2007 年曾被列爲互聯網 20 大安全隱患之一。其他安全隱患,比如 SQL 腳本注入,跨站域腳本攻擊等在近年來已經逐漸爲衆人熟知,很多網站也都針對他們進行了防禦。然而,對於大多數人來說,CSRF 卻依然是一個陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在着 CSRF 漏洞,從而被黑客攻擊而使 Gmail 的用戶造成巨大的損失
2、如何進行攻擊
2.1、 攻擊着首先要確定攻擊的對象,並且分析要攻擊的url。get請求的可以嵌在img標籤,對於post可以使用表單和ajax。
2.2、 攻擊着將要攻擊的url嵌入在自己網站,並且誘使要攻擊的對象來訪問自己的網站。
2.3 、攻擊要滿足以下條件 :
2.3.1、用戶登錄受信任的網站A,並在本地生成cookie。
2.3.2、在不登出的A的情況下,訪問危險網站B,B網站嵌入要攻擊A網站的請求,這時瀏覽器將帶着用戶在A網站生成的cookie,向A網站發起了請求。
2.3.3、網站A是從cookie取出認證信息,進行驗證用戶是否合法。
3、防範方案
在業界目前防禦 CSRF 攻擊主要有以下策略:
1、驗證 HTTP Referer 字段;
2、在請求地址或者請求頭添加 token 並驗證; (本次防禦將結合上面兩種策略進行整改)
4、詳細方案
4.1、驗證 HTTP Referer 字段方案
整改的方法:在後臺添加請求的過濾器,從而將每個請求的Referer頭與受信任的Referer集合進行驗證。驗證不通過轉發到登錄頁面。
該方案也有一定的缺陷,因爲目前已經有一些方法可以篡改 Referer 值,因此需要配合在請求地址或者請求頭添加 token 並驗證方案來預防CSRF。
4.2、在請求地址中添加 token 並驗證的方案
4.2.1 、在用戶登錄成功的時候,生成csrftk,保存在cookie和session。
4.2.2 、前端對post請求添加csrftk和returnType參數或者請求頭,csrftk在發送請求前從cookie中動態的獲取。(ps: returnType “0” 返回40001錯誤狀態碼, “1”返回token過期頁面)
4.2.3 、對於表單的post請求,在觸發提交按鈕之前動態添加隱藏域。
4.2.4 、對於ajax的post請求,在觸發提交按鈕之前在$.ajax裏添加beforeSend屬性來動態的添加請求頭csrftk和returnType
4.2.5 、在後臺添加攔截器,攔截post,get請求,但不攔截登錄請求和靜態資源。
4.2.6 、對於post請求需要驗證token,get和post請求都需要重新生成token,並將csrftk保存在cookie和session。
5、整改注意點
5.1、修改的數據的請求統一改成post的方式,對於查詢的請求使用get方式,前後端請求類型得一致
5.2、攔截器無需攔截靜態資源和登錄接口, 對於post請求需要驗證token,get和post請求都需要重新生成token,並將csrftk保存在cookie和session。
5.3、前端post請求添加請求參數token或者請求頭token,切勿漏掉。
5.4、添加一個參數表明token認證不通過的情況,返回的頁面還是錯誤狀態碼。
5.5、對於前端a標籤修改數據的,需要整改成ajax的形式,並且設置post
5.6、前端token的獲取的時候,要等到觸發提交按鈕的時候再動態的獲取token,因爲token是實時在變化的,必須確保發送請求前的得到的token是最新的,值得注意的是,如果提交表單需要後臺驗證數據,需要確保驗證的請求是同步的,已免因爲兩個異步的請求同時發送,導致會有一個請求的token過期。
6、整改點,示例
流程圖說明:
1、後臺添加攔截器
2.token驗證方法
3.重新生成token,並將token刷新到cookie和session
4.前端封裝獲取cookie的方法,和form表單添加csrftk和returnType的隱藏域
5.修改數據的請求,ajax設置post,並且設置csrftk和returnType請求頭,並根據錯誤狀態碼彈出提示信息
6.點擊表單提交按鈕時,動態添加隱藏域
7.修改數據的請求,前端後臺使用post
注:轉載請說明出處