1. 程式人生 > >MVC防止CSRF攻擊

MVC防止CSRF攻擊

防範 bmi date tex 阻止 出現 人做 簡單 image

可能我們大多數人做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攻擊