CSRF是什么?
跨站請(qǐng)求偽造(英語(yǔ):Cross-site request forgery)逐纬,維基百科的解釋是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法蛔屹,聽(tīng)起來(lái)很厲害的樣子。
簡(jiǎn)單來(lái)說(shuō)豁生,攻擊者利用一些技術(shù)手段去欺騙用戶瀏覽器去訪問(wèn)一些曾經(jīng)認(rèn)證過(guò)的網(wǎng)站而執(zhí)行一些操作兔毒。由于認(rèn)證過(guò),所以瀏覽器認(rèn)為是用戶的本意甸箱。
其實(shí)咋們可以簡(jiǎn)單理解為虎符調(diào)兵
育叁,正常是大將軍頒發(fā)虎符才能調(diào)兵,但是軍隊(duì)只認(rèn)虎符不認(rèn)人摇肌,假如奸臣偷取虎符假傳命令私自調(diào)兵造反擂红,那可就大事不好!
CSRF原理
那我們具體看看攻擊細(xì)節(jié)
[圖片上傳失敗...(image-cabdc9-1515149841622)]
看圖說(shuō)話
大致過(guò)程
- 用戶訪問(wèn)瀏覽正常網(wǎng)站
- 正常網(wǎng)站服務(wù)器響應(yīng)并且返回標(biāo)識(shí)該用戶身份的cookie
- 用戶未注銷正常網(wǎng)站的情況下围小,訪問(wèn)惡意網(wǎng)站
- 惡意網(wǎng)站里訪問(wèn)正常網(wǎng)站并且?guī)е鴺?biāo)識(shí)用戶的cookie
- 正常網(wǎng)站服務(wù)器接受來(lái)自惡意網(wǎng)站的請(qǐng)求
再次訪問(wèn)正常網(wǎng)站時(shí)昵骤,瀏覽器會(huì)自動(dòng)帶上標(biāo)識(shí)該用戶身份的cookie發(fā)送請(qǐng)求,所以正常網(wǎng)站服務(wù)器會(huì)接受來(lái)自惡意網(wǎng)站的請(qǐng)求肯适,從而完成攻擊变秦。
當(dāng)我訪問(wèn)登錄一個(gè)正常網(wǎng)站,成功訪問(wèn)后服務(wù)器會(huì)產(chǎn)生一個(gè)標(biāo)識(shí)用戶身份的cookie給用戶的瀏覽器保存框舔,在標(biāo)識(shí)cookie還存在時(shí)訪問(wèn)惡意網(wǎng)站蹦玫,在該網(wǎng)站里攻擊者會(huì)讓你不知不覺(jué)的訪問(wèn)之前的正常網(wǎng)站并且執(zhí)行一些操作,由于標(biāo)識(shí)用戶身份的cookie還存在刘绣,所以用戶瀏覽器認(rèn)為是用戶的本意操作而執(zhí)行該請(qǐng)求樱溉,從而攻擊成功。
這些欺騙的訪問(wèn)方式有很多纬凤,例如“點(diǎn)擊小廣告福贞、找回密碼”等等誘導(dǎo)用戶去點(diǎn)擊操作。
如何預(yù)防CSRF
我去停士,感覺(jué)都不敢上網(wǎng)沖浪了挖帘。。恋技。
其實(shí)現(xiàn)在瀏覽器和服務(wù)端都做了很多安全防范措施拇舀,大家還是可以安全上網(wǎng)的。
目前預(yù)防方式有二種:
-
檢查Referer字段
HTTP請(qǐng)求head里有個(gè)Referer字段蜻底,用于表明請(qǐng)求的來(lái)源地址骄崩。
正常情況下,Referer字段和請(qǐng)求的地址是位于同一域名下的,
如果是CSRF攻擊發(fā)起的請(qǐng)求刁赖,那么Referer字段和請(qǐng)求的地址就不是同一域名了搁痛,那么服務(wù)器就能識(shí)別出惡意訪問(wèn)长搀。這個(gè)方法缺點(diǎn)是攻擊者有可能篡改該Referer字段內(nèi)容宇弛,從而欺騙服務(wù)器。
-
添加校驗(yàn)token
當(dāng)用戶正常訪問(wèn)網(wǎng)站時(shí)源请,服務(wù)器會(huì)生產(chǎn)一個(gè)隨機(jī)數(shù)枪芒,并且把該隨機(jī)數(shù)埋入該頁(yè)面里(一般放在form表單,
<input type="hidden" name="_csrf_token" value="xxxx">
)谁尸。正常訪問(wèn)舅踪,客戶的瀏覽器是能夠得到并且返回該字段,而CSRF一開(kāi)始是不知道該字段的數(shù)值良蛮,服務(wù)器接受請(qǐng)求發(fā)現(xiàn)該字段的異常抽碌,從而拒絕該請(qǐng)求。
參考資料