自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

mvc3.0防止跨站點(diǎn)請求偽造(CSRF)攻擊

安全 黑客攻防
眾所周知,asp.net mvc程序在瀏覽器運(yùn)行是產(chǎn)生標(biāo)準(zhǔn)的Html標(biāo)簽,包括瀏覽器要發(fā)送的關(guān)鍵數(shù)據(jù)等內(nèi)容都在html內(nèi)容里面。聽起來不錯(cuò),但是假如我們偽造類似的html內(nèi)容,更改里面的關(guān)鍵數(shù)據(jù),在瀏覽器運(yùn)行起來會(huì)怎么樣了?

眾所周知,asp.net mvc程序在瀏覽器運(yùn)行是產(chǎn)生標(biāo)準(zhǔn)的Html標(biāo)簽,包括瀏覽器要發(fā)送的關(guān)鍵數(shù)據(jù)等內(nèi)容都在html內(nèi)容里面。聽起來不錯(cuò),但是假如我們偽造類似的html內(nèi)容,更改里面的關(guān)鍵數(shù)據(jù),在瀏覽器運(yùn)行起來會(huì)怎么樣了?下面我們就做這樣一個(gè)例子。

CSRF攻擊例子:

控制器代碼:

  //初始頁面      

 // GET: /Person/Edit/5       

public ActionResult Edit(int id)       

{          

 return View();       

}       

//修改方法       

// POST: /Person/Edit/5       

[HttpPost]      

 public ActionResult Edit(int id, Person person)       

{            try          

              {               

              // 數(shù)據(jù)庫操作代碼               

          return RedirectToAction("Success",person);           

               }           

              catch           

               {               

                return View();         

              }      

 }

 

視圖代碼:

 

 

@model MvcApplication.Models.Person

@{

    ViewBag.Title = "修改人員";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

<h2>修改人員</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm())

{

    @Html.ValidationSummary(true)

    <fieldset>

        <legend>人員信息</legend>

        @Html.HiddenFor(model => model.ID)

        <div class="editor-label">

            @Html.LabelFor(model => model.Name)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Name)

            @Html.ValidationMessageFor(model => model.Name)

        </div>

        <div class="editor-label">

            @Html.LabelFor(model => model.Age)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Age)

            @Html.ValidationMessageFor(model => model.Age)

        </div>

        <p>

            <input type="submit" value="保存"/>

        </p>

    </fieldset>

}

<div>

    @Html.ActionLink("返回列表", "Index")

</div>


實(shí)現(xiàn)CSRF攻擊:

打開記事本,寫入以下代碼:

<body onload="document.getElementById('fm1').submit()">

<form id="fm1" action="http://localhost:5132/person/Edit/1001" method="post"><

input name="name" value="張三"/>

<input name="age" value="21"/>

</form>

</body>

然后另存為html文件,雙擊文件運(yùn)行。顯示一樣。這個(gè)就叫CSRF攻擊。

什么是CSRF攻擊?


CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。

因?yàn)樵贏SP.NET程序中,我們的用戶信息都是存在與cookies里面的,此時(shí)在用戶自己來說,程序已經(jīng)可以算是裸奔了。正因?yàn)槿绱?,Web程序接受的正??蛻舳苏埱笠话銇碜杂脩舻狞c(diǎn)擊鏈接和表單提交等行為??墒菒阂夤粽邊s可以依靠腳本和瀏覽器的安全缺陷來劫持客戶端會(huì)話、偽造客戶端請求。攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求,以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉(zhuǎn)賬......造成的問題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全。這就是CSRF攻擊。

CSRF漏洞的攻擊一般分為站內(nèi)和站外兩種類型:

CSRF站內(nèi)類型的漏洞在一定程度上是由于程序員濫用$_REQUEST類變量造成的,一些敏感的操作本來是要求用戶從表單提交發(fā)起POST請求傳參給程序,但是由于使用了$_REQUEST等變量,程序也接收GET請求傳參,這樣就給攻擊者使用CSRF攻擊創(chuàng)造了條件,一般攻擊者只要把預(yù)測好的請求參數(shù)放在站內(nèi)一個(gè)貼子或者留言的圖片鏈接里,受害者瀏覽了這樣的頁面就會(huì)被強(qiáng)迫發(fā)起請求。

CSRF站外類型的漏洞其實(shí)就是傳統(tǒng)意義上的外部提交數(shù)據(jù)問題,一般程序員會(huì)考慮給一些留言評論等的表單加上水印以防止SPAM問題,但是為了用戶的體驗(yàn)性,一些操作可能沒有做任何限制,所以攻擊者可以先預(yù)測好請求的參數(shù),在站外的Web頁面里編寫javascript腳本偽造文件請求或和自動(dòng)提交的表單來實(shí)現(xiàn)GET、POST請求,用戶在會(huì)話狀態(tài)下點(diǎn)擊鏈接訪問站外的Web頁面,客戶端就被強(qiáng)迫發(fā)起請求。

瀏覽器的安全缺陷

現(xiàn)在的Web應(yīng)用程序幾乎都是使用Cookie來識別用戶身份以及保存會(huì)話狀態(tài),但是所有的瀏覽器在最初加入Cookie功能時(shí)并沒有考慮安全因素,從WEB頁面產(chǎn)生的文件請求都會(huì)帶上COOKIE

MVC中防止CSRF攻擊

使用AntiForgeryToken令牌,在ASP.NET的核心中為我們提供了一個(gè)用來檢測和組織CSRF攻擊的令牌。

只要在Html表單里面使用了@Html.AntiForgeryToken()就可以阻止CSRF攻擊。

@model MvcApplication.Models.Person

@{

    ViewBag.Title = "修改人員";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

<h2>

    修改人員</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm())

{

    @Html.AntiForgeryToken()

    @Html.ValidationSummary(true)

    <fieldset>

        <legend>人員信息</legend>

        @Html.HiddenFor(model => model.ID)

        <div class="editor-label">

            @Html.LabelFor(model => model.Name)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Name)

            @Html.ValidationMessageFor(model => model.Name)

        </div>

        <div class="editor-label">

            @Html.LabelFor(model => model.Age)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Age)

            @Html.ValidationMessageFor(model => model.Age)

        </div>

        <p>

            <input type="submit" value="保存"/>

        </p>

    </fieldset>

}

<div>

    @Html.ActionLink("返回列表", "Index")

</div>

相應(yīng)的我們要在Controller中也要加入[ValidateAntiForgeryToken]過濾特性。

該特性表示檢測服務(wù)器請求是否被篡改。

注意:該特性只能用于post請求,get請求無效。

 //修改方法

        // POST: /Person/Edit/5

        [ValidateAntiForgeryToken]

        [HttpPost]

        public ActionResult Edit(int id, Person person)

        {

            try

            {

                // 數(shù)據(jù)庫操作代碼


                return RedirectToAction("Success",person);

            }

            catch

            {

                return View();

            }

        }


然后在和上面一樣把頁面代碼復(fù)制保存為html文件運(yùn)行,就會(huì)出錯(cuò)了。

使用Salt值加強(qiáng)保護(hù)

為了保證我們的AntiForgeryToken阻止在程序中唯一,更好的加密AntiForgeryToken,我們可以為AntiForgeryToken設(shè)置Salt值。

這樣,即使攻擊者設(shè)法得到了令牌,但是如果Salt值不匹配也不能進(jìn)行post操作。

//修改方法
        // POST: /Person/Edit/5

        [ValidateAntiForgeryToken(Salt ="aa")]

        [HttpPost]

        public ActionResult Edit(int id, Person person)

        {

            try

            {

                // 數(shù)據(jù)庫操作代碼

                 return RedirectToAction("Success",person);

            }

            catch

            {

                return View();

            }

        }

可以看到加入Salt值后即使是MVC程序本身的頁面都無法請求,更別說攻擊者了,除非他能猜到我們的Salt值。

我們修改view代碼

@Html.AntiForgeryToken("aa")

可以看到在view中加入Salt值后,阻止就變的有目的性了。

總結(jié)

瀏覽器的會(huì)話安全特性 :

我們參照Set-Cookie的標(biāo)準(zhǔn)格式

Set-Cookie: <name>=<value>[; <name>=<value>] [; expires=<date>][; domain=<domain_name>] [; path=<some_path>][; secure][; HttpOnly]

瀏覽器支持的cookie實(shí)際上分為兩種形式:

一種是內(nèi)存COOKIE,在沒有設(shè)定COOKIE值的expires參數(shù),也就是沒有設(shè)置COOKIE的失效時(shí)間情況下,這個(gè)COOKIE在關(guān)閉瀏覽器后將失效,并且不會(huì)保存在本地。另外一種是本地保存COOKIE,也就是設(shè)置了expires參數(shù),COOKIE的值指定了失效時(shí)間,那么這個(gè)COOKIE會(huì)保存在本地,關(guān)閉瀏覽器后再訪問網(wǎng)站,在COOKIE有效時(shí)間內(nèi)所有的請求都會(huì)帶上這個(gè)本地保存COOKIE。

Internet Explorer有一個(gè)隱私報(bào)告功能,其實(shí)這是一個(gè)安全功能,它會(huì)阻擋所有的第三方COOKIE,比如A域Web頁面嵌入了B域的文件,客戶端瀏覽器訪問了A域的Web頁面后對B域所發(fā)起的文件請求所帶上的COOKIE會(huì)被IE攔截。除開文件請求情況,A域的Web頁面如果使用IFRAME幀包含B域的Web頁面,訪問A域的Web頁面后,B域的Web頁面里的所有請求包括文件請求帶上的COOKIE同樣會(huì)被IE攔截。不過Internet Explorer的這個(gè)安全功能有兩個(gè)特性,一是不會(huì)攔截內(nèi)存COOKIE,二是在網(wǎng)站設(shè)置了P3P頭的情況下,會(huì)允許跨域訪問COOKIE,隱私報(bào)告功能就不會(huì)起作用了。

所以在Internet Explorer的這個(gè)安全特性的前提下,攻擊者要進(jìn)行站外的CSRF攻擊使用文件請求來偽造GET請求的話,受害者必須在使用內(nèi)存COOKIE也就是沒有保存登陸的會(huì)話狀態(tài)下才可能成功。而Firefox瀏覽器并沒有考慮使用這樣的功能,站外的CSRF攻擊完全沒有限制。

關(guān)于Javascript劫持技術(shù) :

近年來的web程序頻繁使用Ajax技術(shù),JSON也開始取代XML做為AJAX的數(shù)據(jù)傳輸格式,JSON實(shí)際上就是一段javascript,大部分都是定義的數(shù)組格式。fortify公司的三位安全人員在2007年提出了Javascript劫持技術(shù),這是一種針對JSON動(dòng)態(tài)數(shù)據(jù)的攻擊方式,實(shí)際上這也是一種變相的CSRF攻擊。攻擊者從站外調(diào)用一個(gè)script標(biāo)簽包含站內(nèi)的一個(gè)JSON動(dòng)態(tài)數(shù)據(jù)接口,因?yàn)?lt;script src=”>這種腳本標(biāo)簽的文件請求會(huì)帶上COOKIE,用戶訪問后相當(dāng)于被迫從站外發(fā)起了一個(gè)帶有身份認(rèn)證COOKIE的GET請求,web程序馬上返回了用戶相關(guān)的JSON數(shù)據(jù),攻擊者就可以取得這些關(guān)鍵的JSON數(shù)據(jù)加以利用,整個(gè)過程相當(dāng)于一個(gè)站外類型的CSRF攻擊。

WEB應(yīng)用中的JSON數(shù)據(jù)大部分使用在個(gè)人資料、好友列表等隱私功能里,這類數(shù)據(jù)一般是web蠕蟲最重要的傳播功能所需要的數(shù)據(jù),而CSRF攻擊結(jié)合Javascript劫持技術(shù)完全可以分析這類數(shù)據(jù)制作自動(dòng)傳播的web蠕蟲,在一定情況下這種web蠕蟲比網(wǎng)站出現(xiàn)跨站腳本漏洞制作的web蠕蟲更具威脅性,幾乎不受網(wǎng)站架構(gòu)的限制,因?yàn)楣粽呃玫牟皇莻鹘y(tǒng)的Web漏洞而是網(wǎng)站自身正常的功能,如果出現(xiàn)這類CSRF蠕蟲,對網(wǎng)站的打擊將是災(zāi)難性的。

安全提醒 :

各個(gè)大型社區(qū)類網(wǎng)站必須警惕CSRF攻擊和相關(guān)web蠕蟲的爆發(fā),并且針對這類web攻擊制定有效的應(yīng)急措施。同建議程序員不要濫用$_REQUEST類變量,在必要的情況下給某些敏感的操作加上水印,考慮使用類似DISCUZ論壇的formhash技術(shù)提高黑客預(yù)測請求參數(shù)的難度,注意JSON數(shù)據(jù)接口的安全問題等。最后希望大家全面的考慮客戶端和服務(wù)端整體的安全,注意Internet Explorer等客戶端瀏覽器一些安全缺陷和安全特性,防止客戶端程序的安全問題影響整個(gè)Web應(yīng)用程序。

責(zé)任編輯:藍(lán)雨淚 來源: cnblogs.com
相關(guān)推薦

2013-08-19 10:59:48

2011-04-19 13:40:27

2013-10-29 09:51:33

2013-05-22 18:32:57

2011-05-10 09:55:14

2010-09-27 17:37:10

2021-07-13 15:21:19

MozillaFirefox 90攻擊

2013-01-17 09:39:17

2017-11-02 15:28:52

2017-11-02 14:39:54

2018-10-12 15:50:02

2012-04-12 15:27:44

2021-06-03 10:16:12

CSRF攻擊SpringBoot

2015-09-15 10:52:52

2010-09-16 10:14:35

2013-04-24 15:56:40

2012-11-15 09:51:36

2020-12-21 09:40:06

腳本攻擊XSS漏洞

2016-09-30 15:59:41

2010-10-12 13:25:55

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號