亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

跨站請求偽造

2019-11-14 14:31:22
字體:
來源:轉載
供稿:網友

1. 什么是跨站請求偽造(CSRF)

  CSRF(Cross-site request forgery跨站請求偽造,也被稱為“One Click Attack”或者session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,并且攻擊方式幾乎相左。XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。

  以上是來自百度百科的概念。下面各自舉個簡單的例子說明:

  XSS:假設沒有預防XSS,我在文章評論區域輸入:<scr

  CSRF:與XSS不同,CSRF利用的當前信任用戶,讓用戶不知不覺的“自己提交”數據。例如用戶 B 在用戶 A 的文章評論區域上傳一張圖片,如:

[img]http://images2015.VEVb.com/blog/798800/201512/798800-20151230205214839-1087717627.jpg[/img]

然后把它改成:

[img]http://Another/Forgery.html[/img]

這是一張無效的圖片,并且來自于另一個站點。在 Forgery.html 中,偽造者創建一個表單,action指向要攻擊的頁面,當window.onload 執行時自動提交表單。

那么用戶 A 在訪問該頁面時,就會發起請求到Another/Forgery.html。由于Web的身份驗證信息通常會保存在瀏覽器cookie中,而cookie每次都會隨請求提交到服務器,所以這個請求會把cookie 和 Forgery.html 的表單信息一起提交到服務器。服務器對Cookie進行相關驗證,并且認為這是一個正常的請求,執行相關操作。

2. 模擬一次攻擊

    按照上面的思路,接下來我們模擬一次攻擊。新建一個mvc項目,主要有兩個頁面,一個頁面用于顯示用戶姓名和評論,另一個頁面用于用戶自己修改姓名。只是為了演示,這里我們固定一個用戶:張三。如:  

    public class CurrentUser    {        PRivate static CurrentUser currentUser = new CurrentUser(){Name="張三"};        public string Name{get;set;}        public static CurrentUser Current        {            get            {                return currentUser;            }        }    }

  顯示頁面為:

  

   本站點的另一個頁面用于修改用戶姓名:  

    <div>        修改用戶信息:    </div>    <form action="/home/update" method="post">        <p>            <label>用戶名:</label>            <input name="name" />        </p>        <p>            <input type="submit" />        </p>    </form>

  

  對應Action為Update,為了提高安全性,我們給它標記一個[HttpPost]特性(實際情況這里會進行身份驗證,然后根據用戶id去修改信息)。如:

        [HttpPost]        public ActionResult Update(string name)        {            CurrentUser.Current.Name = name;            return RedirectToAction("Index");        }

  可以看到上面的評論區域有一個鏈接,來自另一個站點,它的代碼很簡單,與我們的修改頁面類似,如下:

<body>    <div>        <form id="form" action="http://localhost:50025/home/update" method="post">            <input type="hidden" name="name" value="2b" />        </form>    </div></body><script type="text/javascript">    window.onload = function () {        document.getElementById("form").submit();    }</script>

  可以看到,該頁面表達的action指向了前面的站點的修改頁面,并且在頁面load完后,就會自動提交。當張三點擊這個鏈接后,會發生什么呢?如下:

 

3. 如何防止

    3.1 盡早防范

  永遠不要相信用戶提交的數據。通常我們會在前臺和后臺對用戶的輸入進行驗證,確保數據的正確性和安全性。以上面的例子,如果用戶上傳一張圖片,然后修改成.html的格式,那么應該不讓它保存。我們可以看博客園的例子,如果這樣做,可以保存,但顯示出來就是普通文本的格式,這樣頁面加載時就不會對這個url發起請求。再看csdn,則會彈出提示非法輸入。

  VEVb:  

  csdn:   

  當然,這樣只是第一道屏障。很多網站也可能像上面可以輸入外部鏈接,如果用戶去點擊,依然可能被攻擊。所以我們還需要進一步防范。

    3.2 MVC 的做法

  前面我們模擬了CSRF的過程,接下看MVC里如何應對這種情況。

  ValidateAntiForgeryAttribute特性

  這是一個繼承了FilterAttribute 和 實現了 IActionFilter 的標記特性,它可以應用在Controller或者Action上面。我們知道實現IActionFilter的 Filter會在 Action執行前進行相關處理,具體邏輯在 IActionFilter接口的 OnAuthorization 方法中。MVC 就是在這個方法中進行驗證的。具體是如何驗證的呢?

  AntiForgeryToken方法

  ValidateAntiForgery特性表示操作需要驗證,我們還需要使用HtmlHelper的 AntiForgeryToken方法,這是一個實例方法。具體是在View的表單里調用該方法,該方法會生成一個name為__RequestVerificationToken的 input hidden標簽,值就是防偽令牌。除此之外,還會生成一個同樣名稱并且標記為HttpOnly的cookie,值也是通過加密生成的防偽令牌。ValidateAntiForgery特性的OnAuthorization方法就是根據這兩個進行驗證的。具體是:

  1. 用戶請求該頁面,AntiForgeryToken方法會生成一個input hidden 和 cookie,值都是經過加密處理的Token。

  2. 用戶提交請求,如果Action(Controller)標記了 ValidateAntiForgery特性,則進行驗證。

      2.1 如果表單沒有一個name為 __RequestVerificationToken的元素,則拋出HttpAntiForgeryException。

    2.2 如果沒有一個name為__RequestVerificationToken的cookie,則拋出HttpAntiForgeryException。

    2.3 解析input 和 cookie 的值,判斷是否匹配(包括用戶名、時間等的比較),不匹配則拋出HttpAntiForgeryException。

  3. 接收到異常,顯示錯誤頁或拋出黃頁。

  至于 input 的值 和 cookie 的生成,mvc內部會根據當前用戶名,時間以及集合 MachineKey 等去加密生成,確保不會輕易被猜出。有興趣的朋友可以通過源碼了解詳細過程。

  按照上面的做法,我們給Update加上一個[ValidateAntiForgery]特性,并且在表單調用HtmlHelper的AntiForgeryToken方法。此時如果用戶點擊鏈接,一樣訪問了Forgery.html,并且自動提交表單,cookie還是一樣會提交,但偽造頁面無法知道input hidden 的值,所以無法通過驗證。

    3.3 WebForm 的做法

  WebForm 沒有 AntiForgeryToken方法 可以直接使用,不過知道MVC的實現過程后,我們也可以自己實現一套。

  在頁面表單,像mvc一樣,我們也輸出一個名稱為:_RequestVerificationToken 的 input hidden 標簽,值為序列化后的Token,具體是調用 HttpRespose 的擴展方法AntiForgeryToken。AntiForgeryToken方法不僅會輸入input hidden,還會將Guid存儲在Context.Item,這是一個在一次請求內各個時期可以使用的集合,在頁面周期完成后,我們判斷是否有這個標記,如果有,還需要將它寫入到Cookie當中。

  表單:

    <form id="Form1" action="UpdateAntiCsrf.aspx" method="post" runat="server">        <div>            <%=Response.AntiForgeryToken() %>            <input type="text" name="name"/>            <input type="submit"/>        </div>    </form>

  AntiForgeryToken擴展方法:

    public static class HttpResposeExtentions    {        public static string AntiForgeryToken(this HttpResponse response)        {            HttpContext context = HttpContext.Current;            if (context == null)            {                throw new InvalidOperationException("無效請求!");            }            Guid guid = Guid.NewGuid();            context.Items["_RequestVerificationToken"] = guid;            ObjectStateFormatter formatter = new ObjectStateFormatter();            return string.Format("<input type='hidden' name='_RequestVerificationToken' value={0} />", formatter.Serialize(guid));                               }    }

  對于驗證Token,和將GUID寫入到Cookie是通過一個AntiCsrfModule完成的,它主要攔截頁面執行前和執行后兩個事件。頁面執行后完成上面是否需要將GUID寫入Cookie的判斷,而頁面執行前則判斷是否需要驗證,以及驗證結果,一旦不匹配,就拋出異常。代碼如下:

    public class AntiCsrfModule : IHttpModule    {        public void Dispose ()        {        }        public void Init(Httpapplication app)         {            app.PreRequestHandlerExecute += new EventHandler(app_PreRequestHandlerExecute);            app.PostRequestHandlerExecute += new EventHandler(app_PostRequestHandlerExecute);        }                void app_PreRequestHandlerExecute(object sender, EventArgs e)        {            HttpContext context = ((HttpApplication)sender).Context;            HttpRequest request = context.Request;            IHttpHandler handler = context.Handler;            if (handler.GetType().IsDefined(typeof(ValidationAntiForgeryAttribute), true))            {                if (request.HttpMethod.Equals("POST", StringComparison.CurrentCultureIgnoreCase))                {                    HttpCookie cookie = request.Cookies["_RequestVerificationToken"];                    if (cookie == null)                    {                        throw new InvalidOperationException("無效請求!");                    }                    string value = request.Form["_RequestVerificationToken"];                    if (string.IsNullOrEmpty(value))                    {                        throw new InvalidOperationException("無效請求!");                    }                    ObjectStateFormatter formatter = new ObjectStateFormatter();                    Guid? guid = formatter.Deserialize(value) as Guid?;                    if(guid.HasValue && guid.Value.ToString() == cookie.Value)                    {                        return;                    }                    throw new InvalidOperationException("無效請求!");                }            }        }        void app_PostRequestHandlerExecute(object sender, EventArgs e)        {            HttpContext context = ((HttpApplication)sender).Context;            Guid? guid = context.Items["_RequestVerificationToken"] as Guid?;            if (guid.HasValue)            {                HttpCookie cookie = new HttpCookie("_RequestVerificationToken", guid.Value.ToString());                cookie.HttpOnly = false;                                context.Response.Cookies.Add(cookie);            }        }    }  

  對于需要驗證的頁面,通過一個ValidateAntiForgeryAttribute特性標記,如下:

    public class ValidateAntiForgeryAttribute : Attribute    {    }

  同樣,我們像前面一樣模擬一次攻擊。結果如我們所想,會拋出黃頁。

  

    3.4 Ajax 方式

  上面我們都是通過Post 表單的形式提交數據,如果是以ajax提交的呢?我們可以在后臺判斷請求是否是Ajax請求,如果不是則不允許操作。因為js受同源策略限制,另一個域在沒有被授權的情況下,腳本是無法和本域進行通信的。也就是Another/Forgery.html可以以post的形式提交數據到我們后臺,但沒辦法以ajax的形式提交,也沒辦法調用我們頁面的方法或者訪問dom元素。

4. 博客園的實現

  例子就在身邊。我們看到博客園【設置基本資料】模塊,查看源碼就會發現這里用用到了這個技術。

  表單:

  

  Cookie:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.精品av.com| 成人黄色免费片| 在线日韩中文字幕| 欧美福利在线观看| 91久久久国产精品| 欧美国产日韩一区二区| 国产精品激情av电影在线观看| 成人国产精品免费视频| 午夜精品三级视频福利| 久久久久久久久久久人体| 亚洲人av在线影院| 色噜噜狠狠狠综合曰曰曰88av| 国产精品综合网站| 国产精品高潮粉嫩av| 亚洲免费精彩视频| 伊人精品在线观看| 国产精品欧美日韩一区二区| 色婷婷综合久久久久| 亚洲人免费视频| 国产精品久久久av久久久| 亚洲国产精品电影在线观看| 国产精品成人久久久久| 亚洲福利视频久久| www.日韩欧美| 日韩专区在线播放| 精品久久久久久久久久久| 最近2019好看的中文字幕免费| 欧美成人免费网| 中文字幕亚洲欧美日韩在线不卡| 亚洲国产精品女人久久久| 色噜噜久久综合伊人一本| 亚洲成色777777女色窝| 97香蕉超级碰碰久久免费软件| 欧美性在线视频| 国产精品免费久久久| 欧美激情免费在线| 两个人的视频www国产精品| 久久琪琪电影院| 久久久久久久久久久91| 国产噜噜噜噜噜久久久久久久久| 亚洲一区二区三区四区视频| 中文字幕视频一区二区在线有码| 久久精品国产亚洲7777| 国产日韩精品在线播放| 亚洲图片欧洲图片av| 欧美中文字幕在线| 国产大片精品免费永久看nba| 国产精品视频久久久久| 亚洲成人网在线观看| 91精品视频免费观看| 欧美日韩人人澡狠狠躁视频| 亚洲v日韩v综合v精品v| 国产精品一区二区久久久| 黑人巨大精品欧美一区二区| 91中文字幕在线| 久久精品亚洲一区| 久久精品在线视频| 性欧美长视频免费观看不卡| 成人黄色生活片| 欧美夫妻性生活xx| 色偷偷偷综合中文字幕;dd| 精品偷拍各种wc美女嘘嘘| 欧美日韩激情视频| 亚洲的天堂在线中文字幕| 成人午夜激情网| 欧美精品激情视频| 亚洲视频欧美视频| 91九色在线视频| 蜜臀久久99精品久久久无需会员| 国产精品亚发布| 国产精品精品国产| 久久久中精品2020中文| 亚洲人午夜色婷婷| 欧美激情精品久久久久久蜜臀| 亚洲第一网站免费视频| 欧美理论电影在线观看| 日韩免费在线视频| 日韩欧美中文第一页| 国产精品国产三级国产aⅴ浪潮| 97久久精品人搡人人玩| 欧美日韩成人在线播放| 欧美成人精品不卡视频在线观看| 伊人男人综合视频网| 91成人天堂久久成人| 神马国产精品影院av| 欧美激情综合色| 精品国产欧美一区二区五十路| 日本精品视频在线观看| 国产精品久久久久久久av大片| 国产精品91一区| 91精品国产成人| 久久精品国产2020观看福利| 国产欧美日韩亚洲精品| 亚洲性日韩精品一区二区| 亚洲91av视频| 国产日韩欧美91| 福利一区福利二区微拍刺激| 久久久久国产精品一区| 国产一区二区色| 成人做爰www免费看视频网站| 国产美女精品视频| 亚洲精品久久久久久久久久久久久| 精品久久久久久久久久久久| 国产精品丝袜视频| 亚洲第一偷拍网| 亚洲人成亚洲人成在线观看| www.久久色.com| 久久影院资源网| 欧美亚洲午夜视频在线观看| 国产亚洲视频中文字幕视频| 亚洲欧美国产精品专区久久| 国产成人精品综合| 91香蕉国产在线观看| 亚洲欧洲视频在线| 在线观看不卡av| 国产精品一区二区三区久久久| 欧美在线观看日本一区| 成人性教育视频在线观看| 91国语精品自产拍在线观看性色| 国产成人精品电影久久久| 欧美裸体视频网站| 亚洲国产精品999| 欧洲精品久久久| 91久久在线视频| 欧美大片免费看| 国产网站欧美日韩免费精品在线观看| 在线观看亚洲视频| www日韩中文字幕在线看| 一本大道亚洲视频| 精品国产视频在线| 亚洲精品www| 亚洲白虎美女被爆操| 日韩av影视在线| 日韩三级成人av网| 国产午夜精品美女视频明星a级| 亚洲欧美日韩国产中文专区| 亚洲国产成人在线视频| 亚洲欧美日韩高清| 成人免费观看49www在线观看| 日韩视频第一页| 国产主播喷水一区二区| 在线精品高清中文字幕| 精品激情国产视频| 亚洲成av人乱码色午夜| 欧美性极品少妇精品网站| 日韩欧美成人免费视频| 日韩在线小视频| 久久久久成人网| 欧美国产极速在线| 亚洲xxx视频| 精品国产乱码久久久久久天美| 国产午夜精品视频| 2025国产精品视频| 国产精品福利在线观看| 欧美日韩国产专区| 久久精品视频在线观看| 色偷偷综合社区| 亚洲国产成人精品女人久久久| 国产精品亚洲精品| 日韩的一区二区| yw.139尤物在线精品视频| 国产精品美女视频网站| 国产精品一二区| 欧美精品在线观看91|