對于CSRF的防御通常有以下三種方法:
1,、使用驗(yàn)證碼
  csrf攻擊一般都是在受害者不知情的情況下進(jìn)行發(fā)起的,,使用驗(yàn)證碼可以有效的防止攻擊,,但是每次請求都要輸入驗(yàn)證碼會(huì)影響用戶體驗(yàn),所以通常只在用戶登陸注冊,,還有一些特定業(yè)務(wù)場景下使用,,比如銀行轉(zhuǎn)賬。如何使用驗(yàn)證碼要根據(jù)業(yè)務(wù)和場景來決定,。
2,、驗(yàn)證http Referer
  http頭中的referer字段記錄了請求來源地址,比如從 http://www.test.com 點(diǎn)擊鏈接到 http://m.test.com 之后,,那么referer就是 http://www.test.com 這個(gè)地址,。攻擊者在對受害者進(jìn)行攻擊的時(shí)候,是在攻擊者自己的服務(wù)器上構(gòu)建自己的惡意腳本,,誘騙受害者點(diǎn)擊,,所以此時(shí)的referer值就是攻擊者自己的URL地址。
通過以上可知,,csrf攻擊都是跨域發(fā)起的,,所以在服務(wù)端針對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ì)通過用戶名和密碼去請求服務(wù)器登陸,服務(wù)端在收到請求后會(huì)驗(yàn)證客戶端傳來的用戶名和密碼,,如果驗(yàn)證通過,,服務(wù)器就會(huì)簽發(fā)一個(gè)token發(fā)給客戶端,并且將token放到session中,客戶端收到token后存儲(chǔ)到本地,,以后客戶端只要每次請求服務(wù)器就要帶上token,,經(jīng)過服務(wù)器驗(yàn)證通過后才會(huì)返回響應(yīng)數(shù)據(jù),否則報(bào)錯(cuò),。
  csrf攻擊成功的前提條件是攻擊者可以完全偽造出受害者的所有請求,,而且請求中的驗(yàn)證信息都在cookie中,黑客只要使用用戶的cookie通過安全驗(yàn)證就可以完成攻擊,。了解了這些之后,,想要防止csrf攻擊,就要在http請求中放置黑客不可以偽造的信息,,而且該信息不可以存在于cookie中,,否則就無效。而token令牌最大的特點(diǎn)就是隨機(jī)性,,不可預(yù)測,,并且不存在于cookie當(dāng)中。
  對于GET請求,,請求參數(shù)直接在URL當(dāng)中,,這樣token的形式就為 http://xxx.com?csrftoken=tokenvalue ,但是這種方式把請求參數(shù)都放在URL中,,會(huì)導(dǎo)致在referer中泄露,,不僅如此,設(shè)想另一種場景,,一個(gè)在內(nèi)網(wǎng)系統(tǒng)的員工,,從內(nèi)部敏感系統(tǒng)在點(diǎn)擊對外部提供服務(wù)的網(wǎng)站鏈接,此時(shí)就會(huì)把內(nèi)網(wǎng)敏感信息通過referer泄漏出去,。而對于POST請求,,token是以隱藏表單存在,`<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>`,。最后注意一點(diǎn),,如果在同域下存在xss漏洞,那么這種使用token的防御將形同虛設(shè),。