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