舉個簡單例子,譬如整個系統(tǒng)的公告在網(wǎng)站首頁顯示,而這個公告是從后臺提交的,我用最簡單的寫法:
網(wǎng)站后臺(Home/Index頁面)設(shè)置首頁公告內(nèi)容,提交到HomeController的Text Action
@using (Html.BeginForm("Text","Home",FormMethod.Post)) { @:輸入信息: } HomeController的Text Action[HttpPost] public ActionResult Text() { ViewBag.Notice = Request.Form["Notice"].ToString(); return View(); }
填寫完公告,提交,顯示
此時提供給了跨站攻擊的漏洞,CSRF一般依賴幾個條件
(1)攻擊者了解受害者所在的站點(diǎn)
(2)攻擊者的目標(biāo)站點(diǎn)具有持久化授權(quán)cookie或者受害者具有當(dāng)前會話cookie
(3)目標(biāo)站點(diǎn)沒有對用戶在網(wǎng)站行為的第二授權(quán)此時
現(xiàn)在我們來開始模擬跨站請求,假設(shè)請求地址是http://localhost:25873/Home/Text,且也滿足2,3的情況。
于是我新建一個AntiForgeryText.html文件,內(nèi)容如下
在這個html中加了一個隱藏的字段,Name和Id和網(wǎng)站要接收的參數(shù)名一樣。
我點(diǎn)擊了“黑掉這個網(wǎng)站”,呈現(xiàn)如下
這個就是利用了漏洞把首頁的公告給改了,這就是一個簡單的跨站攻擊的例子。
MVC中通過在頁面上使用 Html.AntiForgeryToken()配合在對應(yīng)的Action上增加[ValidateAntiForgeryToken]特性來防止跨站攻擊。
把上面的代碼改成
@using (Html.BeginForm("Text","Home",FormMethod.Post)) { @Html.AntiForgeryToken() @:網(wǎng)站公告: } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Text() { ViewBag.Notice = Request.Form["Notice"].ToString(); return View(); }
這樣子我在AntiForgeryText.html中點(diǎn)"黑掉這個網(wǎng)站",再次發(fā)出請求
這就成功的防止了跨站攻擊
參考資料:asp.net mvc中的@Html.AntiForgeryToken()防止跨站攻擊http://www.ourcodelife.com/thread-49179-1-1.html
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com