Html.AntiForgeryToken()
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/,如需轉載,請註明出處,否則將追究法律責任。