Html.AntiForgeryToken()

daqianmen發表於2021-09-09

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站指令碼(XSS),但它與XSS非常不同,XSS利用站點內的信任使用者,而CSRF則透過偽裝來自受信任使用者的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。(百度百科)

一個場景

加入有這樣一個釋出公司新聞的頁面

圖片描述

@{    ViewBag.Title = "News";}

News

@using (Html.BeginForm("PostNews", "News", FormMethod.Post)){         }

圖片描述

控制器

圖片描述

    public class NewsController : Controller    {        // GET: News        [HttpPost]        public ActionResult PostNews()        {            ViewBag.content = Request.Form["content"];            return View();        }        [HttpGet]        public ActionResult News()        {            return View();        }    }

圖片描述

圖片描述

提交成功

圖片描述

此時提供給了跨站攻擊的漏洞,CSRF一般依賴幾個條件

(1)攻擊者知道該目標站點。

(2)攻擊者的目標站點具有持久化授權cookie或者受害者具有當前會話cookie

(3)目標站點沒有對使用者在網站行為的第二授權。

比如我們現在知道釋出新聞的地址:

我們下面新建一個頁面test.html

圖片描述

html>        
                    

圖片描述

發起攻擊

圖片描述

這樣在公司站點的新聞列表就被篡改了。作為安全性考慮,這種情況肯定不會讓它發生的,如果涉及到公司利益,那就損失大了。

MVC中如何防範?

還好,mvc中透過在頁面上使用 Html.AntiForgeryToken()配合在對應的Action上增加[ValidateAntiForgeryToken]特性來防止跨站攻擊。

修改上面提交程式碼

@using (Html.BeginForm("PostNews", "News", FormMethod.Post)){     @Html.AntiForgeryToken()        }

圖片描述

        [HttpPost]        [ValidateAntiForgeryToken]        public ActionResult PostNews()        {            ViewBag.content = Request.Form["content"];            return View();        }

圖片描述

我們這裡再次使用test.html進行提交

圖片描述

我們看一下Html.AntiForgeryToken()會為當前請求,生成一個名為__RequestVerificationToken的cookie,還有一個名為__RequestVerificationToken的隱藏域。

圖片描述

圖片描述

為了驗證一個來自form post請求,還需要在目標action上增加[ValidateAntiForgeryToken]特性,它是一個驗證過濾器,它主要檢查

(1)請求的是否包含一個約定的AntiForgery名的cookie

(2)請求是否有一個Request.Form["約定的AntiForgery名"],約定的AntiForgery名的cookie和Request.Form值是否匹配

總結

在asp.net mvc中,需要加上Html.AntiForgeryToken()防止CSRF攻擊,在使用ajax進行post請求的時候,需要獲取到名為__RequestVerificationToken的隱藏域的值進行一起提交。

參考

http://blog.csdn.net/cpytiger/article/details/8781457

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1727/viewspace-2812234/,如需轉載,請註明出處,否則將追究法律責任。