1. 程式人生 > >ASP.NET MVC 防止 CSRF 的方法

ASP.NET MVC 防止 CSRF 的方法

MVC中的Html.AntiForgeryToken()是用來防止跨站請求偽造(CSRF:Cross-site request forgery)攻擊的一個措施,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻擊不同,XSS一般是利用站內信任的使用者在網站內插入惡意的指令碼程式碼進行攻擊,而CSRF則是偽造成受信任使用者對網站進行攻擊。

舉個簡單例子,譬如整個系統的公告在網站首頁顯示,而這個公告是從後臺提交的,我用最簡單的寫法:

網站後臺(Home/Index頁面)設定首頁公告內容,提交到HomeController的Text Action

@using (Html.BeginForm("Text","Home",FormMethod.Post))
{
    @:網站公告:<input type="text" name="Notice" id="Notice" />
    <input type="submit" value="Submit" />
}

HomeController的Text Action

 [HttpPost]
 public ActionResult Text()
 {
     ViewBag.Notice = Request.Form["Notice"].ToString();
     return View();
 }

填寫完公告,提交,顯示

此時提供給了跨站攻擊的漏洞,CSRF一般依賴幾個條件

(1)攻擊者瞭解受害者所在的站點

(2)攻擊者的目標站點具有持久化授權cookie或者受害者具有當前會話cookie

(3)目標站點沒有對使用者在網站行為的第二授權此時

於是我新建一個AntiForgeryText.html檔案,內容如下:

複製程式碼 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
</head>
<body>
    <form name="badform" method="post" action="http://localhost:6060/Home/Text">
        <input type="hidden" name="Notice" id="Notice" value="你的網站被我黑了。。" />
        <input type="submit" value="黑掉這個網站" />
    </form>
</body>
</html>
複製程式碼

在這個html中加了一個隱藏的欄位,Name和Id和網站要接收的引數名一樣。

我點選了“黑掉這個網站”,呈現如下

 

這個就是利用了漏洞把首頁的公告給改了,這就是一個簡單的跨站攻擊的例子。

MVC中通過在頁面上使用 Html.AntiForgeryToken()配合在對應的Action上增加[ValidateAntiForgeryToken]特性來防止跨站攻擊。

把上面的程式碼改成

@using (Html.BeginForm("Text","Home",FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @:網站公告:<input type="text" name="Notice" id="Notice" />
<input type="submit" value="Submit" />
}

對應的Action

複製程式碼         [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Text()
        {
            ViewBag.Notice = Request.Form["Notice"].ToString();
            return View();
        } 複製程式碼

這樣子我在AntiForgeryText.html中點"黑掉這個網站",就會出現

這樣就防止了跨站攻擊。

頁面上的Html.AntiForgeryToken()會給訪問者一個預設名為__RequestVerificationToken的cookie
為了驗證一個來自form post,還需要在目標action上增加[ValidateAntiForgeryToken]特性,它是一個驗證過濾器,
它主要檢查

(1)請求的是否包含一個約定的AntiForgery名的cookie

(2)請求是否有一個Request.Form["約定的AntiForgery名"],約定的AntiForgery名的cookie和Request.Form值是否匹配

其中主要涉及到System.Web.WebPages.dll中的靜態類AntiForgery
Html.AntiForgeryToken()呼叫了AntiForgery靜態類的GetHtml方法,它產生一個隨機值然後分別儲存到客戶端cookie和頁面的hidden field中,

(2)頁面上的hiddenfield

<input name="__RequestVerificationToken" type="hidden" value="9rUlMYvsH6eMcFN9tn/wRwAG07eROraVaeTn9hHMXKkMmDbR8jLw5DKdVnZBJ9siQHeGyl1w4rSB141LnxMp2ahV0qP1lElPeukqfcUFYoxrm/EfpSJjZavykmzn15VeGFMKkmgFj5a1UFhZFaW2aZgeN38x9lt0OFSoca7eMVU=" />

其中cookie的key的名字和頁面hidden field的名字是一樣的,預設都是"__RequestVerificationToken",如果有提供ApplicationPath的話,那就是由"__RequestVerificationToken"和經過處理後的ApplicationPath組成。

Controller端則通過在Action上增加[ValidateAntiForgeryToken]特性來驗證,
ValidateAntiForgeryTokenAttribute繼承了FilterAttribute和IAuthorizationFilter,通過傳遞匿名委託方法,

委託呼叫AntiForgery類的Validate方法來實現驗證。

Validate方法中主要驗證Request.Cookies[antiForgeryTokenName]和<input name=antiForgeryTokenName ...>兩個的值是否相同,

如果頁面沒有<input name=antiForgeryTokenName ...>,或者兩個值不相等,就會丟擲異常。

 使用該方法的缺點是:

 1. 這種方法是依賴於 cookie的,如果客戶端禁止了 cookie ,那麼這種防範就會失效。

2. 該方法是對 post請求有效,對 Get 請求無效

3. 對於 AJAX請求,MVC 框架不會自動傳遞 cookie和隱藏域。需要自己實現傳輸和讀取。

相關推薦

ASP.NET MVC 防止 CSRF方法

MVC中的Html.AntiForgeryToken()是用來防止跨站請求偽造(CSRF:Cross-site request forgery)攻擊的一個措施,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻擊不同,XSS一般是利用站內信任的使用者在網站內插入惡意的指令碼程式碼進行攻擊,

ASP.NET MVCCSRF(跨站腳本)攻擊

轉移 off end gis 帳戶 blank 表單 密碼 message CSRF 一 何為CSRF CSRF(Cross-site request forgery跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CS

ASP.NET MVC防範CSRF最佳實踐

XSS與CSRF 哈哈,有點標題黨,但我保證這篇文章跟別的不太一樣。 我認為,網站安全的基礎有三塊: 防範中間人攻擊 防範XSS 防範CSRF 注意,我講的是基礎,如果更高階點的話可以考慮防範機器人刷單,再高階點就防範DDoS攻擊,不過我們還是回到“基礎”這個話題上吧,對於中間人攻擊,使用

自定義ASP.NET MVC Html輔助方法

在ASP.NET MVC中,Html輔助方法給我們程式設計師帶來很多方便,其重要性也就不言自明。有時候,我們不想重複地寫一些HTML程式碼,或者MS沒有提供我們想要的那個HTML標籤的Html輔助方法,那麼,我們就可以通過自己定義一個Html擴充套件方法來達到這個目的。

Asp.net MVC 如何防止CSRF攻擊

什麼是CSRF攻擊? CSRF(Cross-site request forgery跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站指令碼(XSS),但

ASP.NET MVC 提高運行速度的幾種性能優化方法

服務 排隊 等待 谷歌搜索 部署 lan str run 提高 主要介紹ASP.NETMVC 應用提速的六種方法,因為沒有人喜歡等待,所以介紹幾種常用的優化方法。 大家可能會遇到排隊等待,遇到紅燈要等待,開個網頁要等待,等等等。 理所當然,沒有人喜歡等待網頁慢吞吞地加載

asp.net MVC Views-----Controller傳遞數據方法

接收 return 傳遞數據 lis guid views product 類名 文件 1.ViewData:C傳遞數據到V中:ViewData["studentList"]=studentList;       V接收C傳來的數據:var stu=(Student)Vie

asp.net mvc 全局權限過濾器及繼成權限方法

otn color code 資源 bug 查詢 linq 授權 exc 全局權限過濾器 //----------------------------------------------------------------------- // <copyrig

ASP.NET MVC中為DropDownListFor設置選中項的方法

相等 ret info href submit value and number else 在MVC中,當涉及到強類型編輯頁,如果有select元素,需要根據當前Model的某個屬性值,讓Select的某項選中。本篇只整理思路,不涉及完整代碼。 □ 思路 往前臺視圖傳的類型

asp.net MVC 中 Session統一驗證的方法

pla sta tails project ssi 一個 str urn string 驗證登錄狀態的方法有:1 進程外Session 2 方法過濾器(建一個類繼承ActionFilterAttribute)然後給需要驗證的方法或控制器加特性標簽 3 :新建一個Ba

[ASP.NET MVC] Controlle中的Aciton方法數據接收方式

http student request str 自動 asp.net nco cti mvc POST數據接收方式包括: 1.request.Form:(逐個獲取表單提交的數據); FormCollection: [HttpPost]public async T

.net異步性能測試(包括ASP.NET MVC WebAPI異步方法

睡眠時間 問題 none seconds await 數字 val http httpget 很久沒有寫博客了,今年做的產品公司這兩天剛剛開了發布會,稍微清閑下來,想想我們做的產品還有沒有性能優化空間,於是想到了.Net的異步可以優化性能,但到底能夠提升多大的比例呢?恰好有

ASP.NET MVC頁面搜索功能實現(普通方法和使用Ajax)

ati isn 數據過濾 valid ren 輸入框 普通 分部視圖 添加 使用以下方法可以對數據進行過濾再在頁面中顯示 假設當前數據庫、控制器和視圖都已創建 模型名為Movies 控制名為MoviesController 顯示頁面的視圖名為Index 數據庫上下文為Mo

ASP.NET MVC系列】淺談表單和HTML輔助方法

繼承 好的 內容 概述 調用 復制 畫圖 models pac 【01】淺談Google Chrome瀏覽器(理論篇) 【02】淺談Google Chrome瀏覽器(操作篇)(上) 【03】淺談Google Chrome瀏覽器(操作篇)(下) 【04】淺談AS

ASP.NET MVC中加載部分視圖的方法及差別

div ring model date render 說明 tro 一個 clas 在視圖裏有多種方法可以加載部分視圖,包括Partial() 、Action()、RenderPartial()、RenderAction()、RenderPage()方法。下面說明一

ASP.NET MVC計劃任務實現方法(定時執行某個功能)

AR tar 註意 eve 文件 ebr send npr 如何實現 系統中定時執行某個任務是比較常用的功能,如一個部門定期向上級部門上報數據是一個典型的例子,下面就簡單說說在.net mvc中如何實現定時執行某個功能的方法。 1、首先修改Glocal.asax文件,在A

如何在asp.net mvc中添加自定義的HTML輔助種方法

步驟 gen 其他 generic url linq build mode 擴展方法 很久沒在博客園發表文章了,今天來總結一下如何在asp.net mvc中添加自定義的HTML輔助方法。我們現在設計這麽一個目前,利用自定義的HTML方法來渲染一個普通的img標記。直接進入主

ASP.NET MVC中的路由IRouteConstraint方法應用實例

http col spa Go clas .aspx direct lec rep 在如下代碼的寫法中: public class RouteConfig { public static void RegisterRoutes(RouteColle

JWT+ASP.NET MVC 時間戳防止重放攻擊

font 例子 memory provider ide 進入 div get encode 時間戳作用 客戶端在向服務端接口進行請求,如果請求信息進行了加密處理,被第三方截取到請求包,可以使用該請求包進行重復請求操作。如果服務端不進行防重放攻擊,就會服務器壓

Asp.net MVC Razor輸出字符串方法(js中嵌入razor)

del 方式 註意 標簽 字符串方法 .net 輸出 text mod @{ Model p = new Model(); //輸出名稱和年齡 //1.第一種方式 @:姓名[email protected] //