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