MVC防止CSRF攻擊

可能咱們大多數人作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]特性從而驗證。

流程就是如此。

相關文章
相關標籤/搜索