返回首页

微信公众号

3、解決方案

對(duì)于CSRF的防御通常有以下三種方法:

1、使用驗(yàn)證碼

  csrf攻擊一般都是在受害者不知情的情況下進(jìn)行發(fā)起的,使用驗(yàn)證碼可以有效的防止攻擊,但是每次請(qǐng)求都要輸入驗(yàn)證碼會(huì)影響用戶體驗(yàn),所以通常只在用戶登陸注冊(cè),還有一些特定業(yè)務(wù)場(chǎng)景下使用,比如銀行轉(zhuǎn)賬。如何使用驗(yàn)證碼要根據(jù)業(yè)務(wù)和場(chǎng)景來決定。

2、驗(yàn)證http Referer

  http頭中的referer字段記錄了請(qǐng)求來源地址,比如從 http://www.test.com 點(diǎn)擊鏈接到 http://m.test.com 之后,那么referer就是 http://www.test.com 這個(gè)地址。攻擊者在對(duì)受害者進(jìn)行攻擊的時(shí)候,是在攻擊者自己的服務(wù)器上構(gòu)建自己的惡意腳本,誘騙受害者點(diǎn)擊,所以此時(shí)的referer值就是攻擊者自己的URL地址。
通過以上可知,csrf攻擊都是跨域發(fā)起的,所以在服務(wù)端針對(duì)referer字段驗(yàn)證是否屬于安全可靠的域名,可在一定程度上有效防御此類攻擊。
但是此類方法并非萬無一失,在低版本存在漏洞的瀏覽器中,黑客可以篡改referer值。另一種情況是csrf結(jié)合xss進(jìn)行攻擊,此時(shí)就不需要跨域發(fā)起,也可以繞過referer驗(yàn)證。

3、使用token

  在說token如何防御csrf攻擊之前,我們先了解下token的工作原理。
當(dāng)用戶第一次進(jìn)行登陸的時(shí)候,客戶端會(huì)通過用戶名和密碼去請(qǐng)求服務(wù)器登陸,服務(wù)端在收到請(qǐng)求后會(huì)驗(yàn)證客戶端傳來的用戶名和密碼,如果驗(yàn)證通過,服務(wù)器就會(huì)簽發(fā)一個(gè)token發(fā)給客戶端,并且將token放到session中,客戶端收到token后存儲(chǔ)到本地,以后客戶端只要每次請(qǐng)求服務(wù)器就要帶上token,經(jīng)過服務(wù)器驗(yàn)證通過后才會(huì)返回響應(yīng)數(shù)據(jù),否則報(bào)錯(cuò)。

  csrf攻擊成功的前提條件是攻擊者可以完全偽造出受害者的所有請(qǐng)求,而且請(qǐng)求中的驗(yàn)證信息都在cookie中,黑客只要使用用戶的cookie通過安全驗(yàn)證就可以完成攻擊。了解了這些之后,想要防止csrf攻擊,就要在http請(qǐng)求中放置黑客不可以偽造的信息,而且該信息不可以存在于cookie中,否則就無效。而token令牌最大的特點(diǎn)就是隨機(jī)性,不可預(yù)測(cè),并且不存在于cookie當(dāng)中。

  對(duì)于GET請(qǐng)求,請(qǐng)求參數(shù)直接在URL當(dāng)中,這樣token的形式就為 http://xxx.com?csrftoken=tokenvalue ,但是這種方式把請(qǐng)求參數(shù)都放在URL中,會(huì)導(dǎo)致在referer中泄露,不僅如此,設(shè)想另一種場(chǎng)景,一個(gè)在內(nèi)網(wǎng)系統(tǒng)的員工,從內(nèi)部敏感系統(tǒng)在點(diǎn)擊對(duì)外部提供服務(wù)的網(wǎng)站鏈接,此時(shí)就會(huì)把內(nèi)網(wǎng)敏感信息通過referer泄漏出去。而對(duì)于POST請(qǐng)求,token是以隱藏表單存在,<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>。最后注意一點(diǎn),如果在同域下存在xss漏洞,那么這種使用token的防御將形同虛設(shè)。

?

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册