MVC防止CSRF攻擊
可能我們大多數人做web的時候不會太註意這個問題,但是這是一個很重要的一個點。我們寫代碼寫業務的時候也應該從各方面多思考。
首先就是先簡單介紹下什麽是CSRF
CSRF 全程是 Cross-site request forgery 中文意思就是跨站請求偽造。和跨站腳本XSS不同,XSS的特點是利用站內受信任的用戶,將代碼植入到提供給其它用戶使用的頁面中,但是CSRF的特點是利用你的身份去做一些服務端認為合法的請求。可能我們很多人都會出現qq空間被莫名的發好多廣告信息,他的流程就是 比如說我們登陸了一個網站 ,一些認證信息保存再cookie中,因為session也就是根據cookie的機制來實現的,當別人拿到這些cookie的時候 就可以利用cookie來做服務端認為合法的事情,發廣告帖什麽的。
防範方式也有很多 在MVC中可以通過ValidateAntiForgeryToken這個特性來做到這一點。同時 這個特性只針對post請求,這個特性的作用就是阻止偽造請求。代碼如下:
[HttpPost] [ValidateInput(false)] [ValidateAntiForgeryToken] public ActionResult Login(string name,string pwd) { if (name==pwd) { return RedirectToAction("Index"); } ModelState.AddModelError("", "用戶名密碼錯誤!"); return View(); }
這時候我們構造一個請求,表單提交,就會拋出這樣的錯誤信息
其實到這一步我們的初步目標就達到了,在本站點中,我們在提交表單的時候,需要使用到Html.AntiForgeryToken()
這個玩意寫在我們的form標簽裏,他的作用就是在form標簽裏面加一個name為__RequestVerificationToken的hidden標簽,這個標簽的value就是一串被加密的字符串。
加密器是MachineKey。同時這玩意還生成了一個名為__RequestVerificationToken的cookie。
@using (Html.BeginForm("Login", "Home", FormMethod.Post)) { @Html.AntiForgeryToken()@Html.ValidationSummary(true) <div class="form-group"> <label class="label-danger">用戶名:</label> <input type="text" name="name" /> </div> <div class="form-group"> <label class="label-danger">密碼:</label> <input type="text" name="pwd" /> </div> <div class="form-group"> <button type="submit" class="btn-primary">登陸</button> </div> }
這時候我們就可以構造合法且相對安全的請求了。
總結一下 csrf 就是別人利用你的身份進行惡意操作。
而我們在MVC中的應對之道就是別form表單裏面使用 @Html.AntiForgeryToken()
這玩意的作用就是通過MachineKey加密從而生成了一個hidden標簽以及寫入cookie
在Controller裏面,Action加上 [ValidateAntiForgeryToken]特性從而驗證。
流程就是如此。
MVC防止CSRF攻擊