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