W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。
那么CSRF到底能夠干嘛呢?你可以這樣簡單的理解:攻擊者可以盜用你的登陸信息,以你的身份模擬發(fā)送各種請求。攻擊者只要借助少許的社會工程學(xué)的詭計,例如通過QQ等聊天軟件發(fā)送的鏈接(有些還偽裝成短域名,用戶無法分辨),攻擊者就能迫使Web應(yīng)用的用戶去執(zhí)行攻擊者預(yù)設(shè)的操作。例如,當(dāng)用戶登錄網(wǎng)絡(luò)銀行去查看其存款余額,在他沒有退出時,就點擊了一個QQ好友發(fā)來的鏈接,那么該用戶銀行帳戶中的資金就有可能被轉(zhuǎn)移到攻擊者指定的帳戶中。
所以遇到CSRF攻擊時,將對終端用戶的數(shù)據(jù)和操作指令構(gòu)成嚴(yán)重的威脅;當(dāng)受攻擊的終端用戶具有管理員帳戶的時候,CSRF攻擊將危及整個Web應(yīng)用程序。
下圖簡單闡述了CSRF攻擊的思想
從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟 :
看到這里,讀者也許會問:“如果我不滿足以上兩個條件中的任意一個,就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發(fā)生:
因此對于用戶來說很難避免在登陸一個網(wǎng)站之后不點擊一些鏈接進行其他操作,所以隨時可能成為CSRF的受害者。
CSRF攻擊主要是因為Web的隱式身份驗證機制,Web的身份驗證機制雖然可以保證一個請求是來自于某個用戶的瀏覽器,但卻無法保證該請求是用戶批準(zhǔn)發(fā)送的。
過上面的介紹,讀者是否覺得這種攻擊很恐怖,意識到恐怖是個好事情,這樣會促使你接著往下看如何改進和防止類似的漏洞出現(xiàn)。
CSRF的防御可以從服務(wù)端和客戶端兩方面著手,防御效果是從服務(wù)端著手效果比較好,現(xiàn)在一般的CSRF防御也都在服務(wù)端進行。
服務(wù)端的預(yù)防CSRF攻擊的方式方法有多種,但思想上都是差不多的,主要從以下2個方面入手:
我們上一章介紹過REST方式的Web應(yīng)用,一般而言,普通的Web應(yīng)用都是以GET、POST為主,還有一種請求是Cookie方式。我們一般都是按照如下方式設(shè)計應(yīng)用:
接下來我就以Go語言來舉例說明,如何限制對資源的訪問方法:
mux.Get("/user/:uid", getuser)
mux.Post("/user/:uid", modifyuser)
這樣處理后,因為我們限定了修改只能使用POST,當(dāng)GET方式請求時就拒絕響應(yīng),所以上面圖示中GET方式的CSRF攻擊就可以防止了,但這樣就能全部解決問題了嗎?當(dāng)然不是,因為POST也是可以模擬的。
因此我們需要實施第二步,在非GET方式的請求中增加隨機數(shù),這個大概有三種方式來進行:
生成隨機數(shù)token
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
io.WriteString(h, "ganraomaxxxxxxxxx")
token := fmt.Sprintf("%x", h.Sum(nil))
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, token)
輸出token
<input type="hidden" name="token" value="{{.}}">
驗證token
r.ParseForm()
token := r.Form.Get("token")
if token != "" {
//驗證token的合法性
} else {
//不存在token報錯
}
這樣基本就實現(xiàn)了安全的POST,但是也許你會說如果破解了token的算法呢,按照理論上是,但是實際上破解是基本不可能的,因為有人曾計算過,暴力破解該串大概需要2的11次方時間。
跨站請求偽造,即CSRF,是一種非常危險的Web安全威脅,它被Web安全界稱為“沉睡的巨人”,其威脅程度有此“美譽”便可見一斑。本小節(jié)不僅對跨站請求偽造本身進行了簡單介紹,還詳細說明造成這種漏洞的原因所在,然后以此提了一些防范該攻擊的建議,希望對讀者編寫安全的Web應(yīng)用能夠有所啟發(fā)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: