CSRF修復——看完的你多了一把刷子

近期項目對漏洞修復這一塊比較看重,例舉下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

注:轉載請說明出處 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章