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