mvc 當中 [ValidateAntiForgeryToken] 的作用
用途:防止CSRF(跨網站請求偽造)。
用法:在View->Form表單中:<%:Html.AntiForgeryToken()%>
在Controller->Action動作上:[ValidateAntiForgeryToken]
原理:
1、<%:Html.AntiForgeryToken()%>這個方法會生成一個隱藏域:<inputname="__RequestVerificationToken" type="hidden" value="7FTM...sdLr1" />並且會將一個以"__RequestVerificationToken“為KEY的COOKIE給控制層。
2、[ValidateAntiForgeryToken],根據傳過來的令牌進行對比,如果相同,則允許訪問,如果不同則拒絕訪問。
關鍵:ValidateAntiForgeryToken只針對POST請求。
換句話說,[ValidateAntiForgeryToken]必須和[HttpPost]同時加在一個ACTION上才可以正常使用。
一.CSRF是什麽?
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。
二.CSRF可以做什麽?
你這可以這麽理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求。CSRF能夠做的事情包括:以你名義發送郵件,發消息,盜取你的賬號,甚至於購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私泄露以及財產安全。
三.CSRF漏洞現狀
CSRF這種攻擊方式在2000年已經被國外的安全人員提出,但在國內,直到06年才開始被關註,08年,國內外的多個大型社區和交互網站分別 爆出CSRF漏洞,如:NYTimes.com(紐約時報)、Metafilter(一個大型的BLOG網站),YouTube和百度HI......而 現在,互聯網上的許多站點仍對此毫無防備,以至於安全業界稱CSRF為“沈睡的巨人”。
四.CSRF的原理
從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登錄受信任網站A,並在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。
看到這裏,你也許會說:“如果我不滿足以上兩個條件中的一個,我就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發生:
1.你不能保證你登錄了一個網站後,不再打開一個tab頁面並訪問另外的網站。
2.你不能保證你關閉瀏覽器了後,你本地的Cookie立刻過期,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認為關閉瀏覽器就等於退出登錄/結束會話了......)
3.上圖中所謂的攻擊網站,可能是一個存在其他漏洞的可信任的經常被人訪問的網站。
具體步驟:
1、在Html表單裏面使用了@Html.AntiForgeryToken()就可以阻止CSRF攻擊。
2、相應的我們要在Controller中也要加入[ValidateAntiForgeryToken]過濾特性。該特性表示檢測服務器請求是否被篡改。註意:該特性只能用於post請求,get請求無效。
3、至於JS,我們的項目中引用的是<script src="@Url.Content("~/Content/js/jqueryToken-1.4.2.js")" type="text/javascript"></script>
在JS時要使用: $.ajaxAntiForgery才行,
如:
$.ajaxAntiForgery({
type: "post",
data: { GroupName: $("#GroupName").val(), GroupPhones: $("#GroupPhones").val() },
dataType: "json",
url: "/Event/Mass/AddGroup",
success: function (data) {
if (data) {
alert("添加成功 ");
$.unblockUI();
}
else {
alert("添加失敗 ");
}
}
})
註:對數據進行增刪改時要防止csrf攻擊!
mvc 當中 [ValidateAntiForgeryToken] 的作用