CSRF,即Cross-site request forgery,中文通常叫跨站請求僞造。前端
攻擊原理是,用戶在A網站(登陸,以後打開一個B網站,B網站的腳本(或HTML標籤)向A網站發送一個請求,這個請求會自動攜帶用戶的COOKIE,若是這時A網站驗證成功,則完成了攻擊。算法
那麼,具體的攻擊過程是什麼?後端
1)用戶登陸A網站。api
A網站提供一個修改用戶名的api,例如http://A.com/modName?newname=test1。這個api會驗證cookie,驗證經過以後則修改用戶名。服務器
2)以後用戶登陸B網站,B網站的裏有一段代碼以下(能夠成功把用戶在A網站的名字修改成test2,由於發往A.com的請求都會自動帶上A.com的cookie):cookie
<img src="http://A.com/modName?newname=test1" />網站
很簡單吧,但這就完成了一次跨站請求僞造的攻擊。咱們能夠看出攻擊要點在:編碼
1)A網站的服務器對cookie的簡單直接驗證。token
2)用戶登陸網站A以後能引導TA打開B網站。接口
攻擊簡單,解決方案也很簡單:
1,保證A網站的全部api接口都不僅是經過驗證cookie就完成用戶確認。
2,前端與後端配合,使用同一個算法,在發送請求前,居於cookie再產生一個編碼(也能夠叫token)發送到服務器端,服務器端對這個token進行驗證。
爲何能解決問題?由於網站B雖然能僞造請求(即修改參數),但網站B獲取不了A網站的cookie,這樣網站B就僞造不出這個token,A網站獲取不到這個token則沒法完成用戶確認。
PS:固然,服務器端還能夠經過檢測refer這個屬性來防範CSRF,但這個可能會把部分用戶正常請求當成非法請求,例如https轉到http。