1.什麼是CSRF攻擊?瀏覽器
CSRF(Cross-site request forgery),中文名稱:跨站請求僞造,也被稱爲:one click attack/session riding,縮寫爲:CSRF/XSRF。簡單來講,攻擊者盜用了你的身份,以你的名義發送惡意請求。安全
好比你登錄了網銀(假定是A網站)查看帳戶餘額,這時候你的帳戶登陸信息就以cookie的形式保存在訪問的本地磁盤上。這時候你看到了一個醒目的連接,手欠點了進去,這時候CSRF就來了。服務器
假如你訪問的這個網站是惡意網站(假定是B網站),B站向A站發出請求轉帳到某帳戶的請求,而後就沒有而後了。。。cookie
總結一下CSRF攻擊的條件:session
1.你在沒登出訪問網站的狀況下去訪問危險網站。xss
2.攻擊者瞭解你訪問的網站(好比上面說的網銀),這樣才能發出準確的請求。post
3.攻擊者的目標站點具備持久化受權cookie或者受害者具備當前會話cookie。網站
4.目標站點沒有對用戶在網站行爲的第二受權此時。spa
這時候,你可能會說:「若是我不知足以上兩個條件中的一個,我就不會受到CSRF的攻擊」。是的,確實如此,但你不能保證如下狀況不會發生:3d
1.你不能保證你登陸了一個網站後,再也不打開一個tab頁面並訪問另外的網站。
2.你不能保證你關閉瀏覽器了後,你本地的Cookie馬上過時,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認爲關閉瀏覽器就等於退出登陸/結束會話了......)
3.上圖中所謂的攻擊網站,多是一個存在其餘漏洞的可信任的常常被人訪問的網站。
既然有CSRF攻擊,那必須得有辦法防止它。MVC中的Token就是針對解決CSRF攻擊的。
具體步驟:
1.在Html表單裏面使用@Html.AntiForgeryToken()。頁面上的Html.AntiForgeryToken()會給訪問者一個默認名爲__RequestVerificationToken的cookie。
1 <input name="__RequestVerificationToken" type="hidden" value="9rUlMYvsH6eMcFN9tn/wRwAG07eROraVaeTn9hHMXKkMmDbR8jLw5DKdVnZBJ9siQHeGyl1w4rSB141LnxMp2ahV0qP1lElPeukqfcUFYoxrm/EfpSJjZavykmzn15VeGFMKkmgFj5a1UFhZFaW2aZgeN38x9lt0OFSoca7eMVU=" />
Html.AntiForgeryToken()調用了AntiForgery靜態類的GetHtml方法,它產生一個隨機值而後分別存儲到客戶端cookie和頁面的hidden field中,其中cookie的key的名字和頁面hidden field的名字是同樣的,默認都是"__RequestVerificationToken",若是有提供
ApplicationPath的話,那就是由"__RequestVerificationToken"和通過處理後的ApplicationPath組成。
2.爲了驗證一個來自form post,還須要在目標action上增長[ValidateAntiForgeryToken]特性,它是一個驗證過濾器,它主要檢查:
(1)請求的是否包含一個約定的AntiForgery名的cookie;
(2)請求是否有一個Request.Form["約定的AntiForgery名"],約定的AntiForgery名的cookie和Request.Form值是否匹配;
1 [HttpPost] 2 [ValidateAntiForgeryToken] 3 public ActionResult Index() 4 { 5 return View(); 6 }
ValidateAntiForgeryTokenAttribute繼承了FilterAttribute和IAuthorizationFilter,經過傳遞匿名委託方法,
委託調用AntiForgery類的Validate方法來實現驗證。
Validate方法中主要驗證Request.Cookies[antiForgeryTokenName]和<input name=antiForgeryTokenName ...>兩個的值是否相同,
若是頁面沒有<input name=antiForgeryTokenName ...>,或者兩個值不相等,就會拋出異常。
加了Token以後,若是不當心進入危險網站,並提交了請求,服務器端action上的[ValidateAntiForgeryToken]特性就會去驗證,若是提交請求中沒有token或者token不匹配則拒絕訪問。
固然,並非說加了token就安全了,安全永遠都是相對的。雖然惡意網站不能被token擋了一層,但若是有辦法獲取到cookie呢?不就拿到token了?這就有事xss攻擊了,詳細看下一篇。