CSRF是什么
CSRF:Cross-site request forgery。
是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。簡單地說,是攻擊者通過一些技術(shù)手段欺騙用戶的瀏覽器去訪問一個自己曾經(jīng)認(rèn)證過的網(wǎng)站并執(zhí)行一些操作(如發(fā)郵件,發(fā)消息,甚至財(cái)產(chǎn)操作如轉(zhuǎn)賬和購買商品)。由于瀏覽器曾經(jīng)認(rèn)證過,所以被訪問的網(wǎng)站會認(rèn)為是真正的用戶操作而去執(zhí)行。這利用了web中用戶身份驗(yàn)證的一個漏洞:簡單的身份驗(yàn)證只能保證請求發(fā)自某個用戶的瀏覽器,卻不能保證請求本身是用戶自愿發(fā)出的。
如何預(yù)防
- 檢查Referer字段
HTTP頭中有一個Referer字段,這個字段用以標(biāo)明請求來源于哪個地址。在處理敏感數(shù)據(jù)請求時,通常來說,Referer字段應(yīng)和請求的地址位于同一域名下。以上文銀行操作為例,Referer字段地址通常應(yīng)該是轉(zhuǎn)賬按鈕所在的網(wǎng)頁地址,應(yīng)該也位www.examplebank.com之下。而如果是CSRF攻擊傳來的請求,Referer字段會是包含惡意網(wǎng)址的地址,不會位于www.examplebank.com之下,這時候服務(wù)器就能識別出惡意的訪問。
這種辦法簡單易行,工作量低,僅需要在關(guān)鍵訪問處增加一步校驗(yàn)。但這種辦法也有其局限性,因其完全依賴瀏覽器發(fā)送正確的Referer字段。雖然http協(xié)議對此字段的內(nèi)容有明確的規(guī)定,但并無法保證來訪的瀏覽器的具體實(shí)現(xiàn),亦無法保證瀏覽器沒有安全漏洞影響到此字段。并且也存在攻擊者攻擊某些瀏覽器,篡改其Referer字段的可能。 - 添加校驗(yàn)token
由于CSRF的本質(zhì)在于攻擊者欺騙用戶去訪問自己設(shè)置的地址,所以如果要求在訪問敏感數(shù)據(jù)請求時,要求用戶瀏覽器提供不保存在cookie中,并且攻擊者無法偽造的數(shù)據(jù)作為校驗(yàn),那么攻擊者就無法再執(zhí)行CSRF攻擊。這種數(shù)據(jù)通常是表單中的一個數(shù)據(jù)項(xiàng)。服務(wù)器將其生成并附加在表單中,其內(nèi)容是一個偽亂數(shù)。當(dāng)客戶端通過表單提交請求時,這個偽亂數(shù)也一并提交上去以供校驗(yàn)。正常的訪問時,客戶端瀏覽器能夠正確得到并傳回這個偽亂數(shù),而通過CSRF傳來的欺騙性攻擊中,攻擊者無從事先得知這個偽亂數(shù)的值,服務(wù)器端就會因?yàn)樾r?yàn)token的值為空或者錯誤,拒絕這個可疑請求。