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

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

保護ASP.NET應用免受CSRF攻擊

2019-11-14 14:24:35
字體:
來源:轉載
供稿:網友

CSRF是什么?

  CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。CSRF(Cross Site Request Forgery, 跨站域請求偽造)是一種網絡的攻擊方式,它在 2007 年曾被列為互聯網 20 大安全隱患之一。其他安全隱患,比如 SQL 腳本注入,跨站域腳本攻擊等在近年來已經逐漸為眾人熟知,很多網站也都針對他們進行了防御。然而,對于大多數人來說,CSRF 卻依然是一個陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在著 CSRF 漏洞,從而被黑客攻擊而使 Gmail 的用戶造成巨大的損失。

CSRF可以做什么?

  你這可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求。CSRF能夠做的事情包括:以你名義發送郵件,發消息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私泄露以及財產安全。

CSRF攻擊原理

csrf

從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

  1.登錄受信任網站A,并在本地生成Cookie。

  2.在不登出A的情況下,訪問危險網站B。

  看到這里,你也許會說:“如果我不滿足以上兩個條件中的一個,我就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發生:

  1.你不能保證你登錄了一個網站后,不再打開一個tab頁面并訪問另外的網站。

  2.你不能保證你關閉瀏覽器了后,你本地的Cookie立刻過期,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認為關閉瀏覽器就等于退出登錄/結束會話了......)

  3.上圖中所謂的攻擊網站,可能是一個存在其他漏洞的可信任的經常被人訪問的網站。

上面大概地講了一下CSRF攻擊的思想,下面我將用個例子詳細說說具體的CSRF攻擊,這里我以一個銀行轉賬的操作作為例子(僅僅是例子,真實的銀行網站沒這么傻:>)

  銀行網站A,它以GET請求來完成銀行轉賬的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000

  危險網站B,它里面有一段HTML的代碼如下:

  <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

  首先,你登錄了銀行網站A,然后訪問危險網站B,噢,這時你會發現你的銀行賬戶少了1000塊......

  為什么會這樣呢?原因是銀行網站A違反了HTTP規范,使用GET請求更新資源。在訪問危險網站B的之前,你已經登錄了銀行網站A,而B中的<img>以GET的方式請求第三方資源(這里的第三方就是指銀行網站了,原本這是一個合法的請求,但這里被不法分子利用了),所以你的瀏覽器會帶上你的銀行網站A的Cookie發出Get請求,去獲取資源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”,結果銀行網站服務器收到請求后,認為這是一個更新資源操作(轉賬操作),所以就立刻進行轉賬操作......

當前防御 CSRF 的幾種策略

在業界目前防御 CSRF 攻擊主要有三種策略:驗證 HTTP Referer 字段;在請求地址中添加 token 并驗證;在 HTTP 頭中自定義屬性并驗證。下面就分別對這三種策略進行詳細介紹。

驗證 HTTP Referer 字段

根據 HTTP 協議,在 HTTP 頭中有一個字段叫 Referer,它記錄了該 HTTP 請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求來自于同一個網站,比如需要訪問 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用戶必須先登陸 bank.example,然后通過點擊頁面上的按鈕來觸發轉賬事件。這時,該轉帳請求的 Referer 值就會是轉賬按鈕所在的頁面的 URL,通常是以 bank.example 域名開頭的地址。而如果黑客要對銀行網站實施 CSRF 攻擊,他只能在他自己的網站構造請求,當用戶通過黑客的網站發送請求到銀行時,該請求的 Referer 是指向黑客自己的網站。因此,要防御 CSRF 攻擊,銀行網站只需要對于每一個轉賬請求驗證其 Referer 值,如果是以 bank.example 開頭的域名,則說明該請求是來自銀行網站自己的請求,是合法的。如果 Referer 是其他網站的話,則有可能是黑客的 CSRF 攻擊,拒絕該請求。

這種方法的顯而易見的好處就是簡單易行,網站的普通開發人員不需要操心 CSRF 的漏洞,只需要在最后給所有安全敏感的請求統一增加一個攔截器來檢查 Referer 的值就可以。特別是對于當前現有的系統,不需要改變當前系統的任何已有代碼和邏輯,沒有風險,非常便捷。

然而,這種方法并非萬無一失。Referer 的值是由瀏覽器提供的,雖然 HTTP 協議上有明確的要求,但是每個瀏覽器對于 Referer 的具體實現可能有差別,并不能保證瀏覽器自身沒有安全漏洞。使用驗證 Referer 值的方法,就是把安全性都依賴于第三方(即瀏覽器)來保障,從理論上來講,這樣并不安全。事實上,對于某些瀏覽器,比如 IE6 或 FF2,目前已經有一些方法可以篡改 Referer 值。如果 bank.example 網站支持 IE6 瀏覽器,黑客完全可以把用戶瀏覽器的 Referer 值設為以 bank.example 域名開頭的地址,這樣就可以通過驗證,從而進行 CSRF 攻擊。

即便是使用最新的瀏覽器,黑客無法篡改 Referer 值,這種方法仍然有問題。因為 Referer 值會記錄下用戶的訪問來源,有些用戶認為這樣會侵犯到他們自己的隱私權,特別是有些組織擔心 Referer 值會把組織內網中的某些信息泄露到外網中。因此,用戶自己可以設置瀏覽器使其在發送請求時不再提供 Referer。當他們正常訪問銀行網站時,網站會因為請求沒有 Referer 值而認為是 CSRF 攻擊,拒絕合法用戶的訪問。

在請求地址中添加 token 并驗證

CSRF 攻擊之所以能夠成功,是因為黑客可以完全偽造用戶的請求,該請求中所有的用戶驗證信息都是存在于 cookie 中,因此黑客可以在不知道這些驗證信息的情況下直接利用用戶自己的 cookie 來通過安全驗證。要抵御 CSRF,關鍵在于在請求中放入黑客所不能偽造的信息,并且該信息不存在于 cookie 之中??梢栽?HTTP 請求中以參數的形式加入一個隨機產生的 token,并在服務器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內容不正確,則認為可能是 CSRF 攻擊而拒絕該請求。

這種方法要比檢查 Referer 要安全一些,token 可以在用戶登陸后產生并放于 session 之中,然后在每次請求時把 token 從 session 中拿出,與請求中的 token 進行比對,但這種方法的難點在于如何把 token 以參數的形式加入請求。對于 GET 請求,token 將附在請求地址之后,這樣 URL 就變成 http://url?csrftoken=tokenvalue。 而對于 POST 請求來說,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,這樣就把 token 以參數的形式加入請求了。但是,在一個網站中,可以接受請求的地方非常多,要對于每一個請求都加上 token 是很麻煩的,并且很容易漏掉,通常使用的方法就是在每次頁面加載時,使用 javascript 遍歷整個 dom 樹,對于 dom 中所有的 a 和 form 標簽后加入 token。這樣可以解決大部分的請求,但是對于在頁面加載之后動態生成的 html 代碼,這種方法就沒有作用,還需要程序員在編碼時手動添加 token。

該方法還有一個缺點是難以保證 token 本身的安全。特別是在一些論壇之類支持用戶自己發表內容的網站,黑客可以在上面發布自己個人網站的地址。由于系統也會在這個地址后面加上 token,黑客可以在自己的網站上得到這個 token,并馬上就可以發動 CSRF 攻擊。為了避免這一點,系統可以在添加 token 的時候增加一個判斷,如果這個鏈接是鏈到自己本站的,就在后面添加 token,如果是通向外網則不加。不過,即使這個 csrftoken 不以參數的形式附加在請求之中,黑客的網站也同樣可以通過 Referer 來得到這個 token 值以發動 CSRF 攻擊。這也是一些用戶喜歡手動關閉瀏覽器 Referer 功能的原因。

在 HTTP 頭中自定義屬性并驗證

這種方法也是使用 token 并進行驗證,和上一種方法不同的是,這里并不是把 token 以參數的形式置于 HTTP 請求之中,而是把它放到 HTTP 頭中自定義的屬性里。通過 xmlHttPRequest 這個類,可以一次性給所有該類請求加上 csrftoken 這個 HTTP 頭屬性,并把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,通過 xmlhttpRequest 請求的地址不會被記錄到瀏覽器的地址欄,也不用擔心 token 會透過 Referer 泄露到其他網站中去。

然而這種方法的局限性非常大。XMLHttpRequest 請求通常用于 Ajax 方法中對于頁面局部的異步刷新,并非所有的請求都適合用這個類來發起,而且通過該類請求得到的頁面不能被瀏覽器所記錄下,從而進行前進,后退,刷新,收藏等操作,給用戶帶來不便。另外,對于沒有進行 CSRF 防護的遺留系統來說,要采用這種方法來進行防護,要把所有請求都改為 XMLHttpRequest 請求,這樣幾乎是要重寫整個網站,這代價無疑是不能接受的。

 

CSRF的防御

  我總結了一下看到的資料,CSRF的防御可以從服務端和客戶端兩方面著手,防御效果是從服務端著手效果比較好,現在一般的CSRF防御也都在服務端進行。這里給大家介紹一個開源項目,具體的內容可以參考作者的博客《Protecting asp.net applications Against CSRF Attacks》。

1、通過Nuget 安裝ARMOR Web Framework

PM> Install-Package Daishi.Armor.WebFramework

2、添加幾個配置項

<add key=“IsArmed” value=“true” />

<add key=“ArmorEncryptionKey” value=“{Encryption Key}” />

<add key=“ArmorHashKey” value=“{Hashing Key}” />

<add key=“ArmorTimeout” value=“1200000” />

IsArmed: 打開或者關閉ARMOR 功能開關

ArmorEncryptionKey:ARMOR 的加密密鑰,用于加密和解密Token

ArmorHashKey:用于生成和驗證ARMOR 哈希值,包含在令牌內。ARMOR 用這個實現是否token被篡改過。

ArmorTimeout:以毫秒為單位的ARMOR 的token有效期

可以用下面的這段代碼去生成

byte[] encryptionKey = new byte[32];

byte[] hashingKey = new byte[32];

using (var provider = new RNGCryptoServiceProvider()) {

provider.GetBytes(encryptionKey);

provider.GetBytes(hashingKey);

3、應用程序中加入 一個ARMOR 鉤子

ARMOR主要有 Authorization Filter、 Fortification Filter 和 ARMOR UI Components,支持ASP.NET MVC和ASP.NET Web API具體的使用方法可以參照Protecting ASP.NET Applications Against CSRF Attacks。

 

參考文章:

[1].Preventing CSRF

[2].Security Corner: Cross-Site Request Forgeries

[3].《深入解析跨站請求偽造漏洞:原理剖析》

[4].《Web安全測試之跨站請求偽造(CSRF)》

[5].《深入解析跨站請求偽造漏洞:實例講解》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品黄色影片导航在线观看| 国产日韩在线看| 国产成人综合亚洲| 亚洲国产中文字幕久久网| 欧美视频在线视频| 中文字幕精品www乱入免费视频| 欧美在线视频免费| 日韩av影院在线观看| 欧美黑人巨大xxx极品| 欧美精品做受xxx性少妇| 久久久欧美一区二区| 国产va免费精品高清在线观看| 色综合91久久精品中文字幕| 久久青草福利网站| 亚洲精品日韩av| 国产精品v片在线观看不卡| 久久久久久综合网天天| 欧美激情一区二区久久久| 国产精品福利网站| 国产98色在线| 亚洲欧美激情另类校园| 韩国一区二区电影| 欧美一区深夜视频| 欧美成人精品xxx| 国产精品视频yy9099| 亚洲xxxxx| 日韩av电影中文字幕| 久久影院在线观看| 45www国产精品网站| 国产日本欧美在线观看| 欧美激情乱人伦一区| 亚洲第一区在线观看| 精品动漫一区二区三区| 91亚洲精品一区| 亚洲美女精品成人在线视频| 久久久久久久网站| 亚洲国产精久久久久久久| 欧美性猛交xxxx乱大交3| 亚洲区bt下载| 亚洲国产精品va在线看黑人动漫| 日av在线播放中文不卡| 欧美日韩国产二区| 亚洲视频axxx| 亚洲的天堂在线中文字幕| 在线成人激情黄色| 欧美日本中文字幕| 日韩亚洲精品视频| 欧美在线观看网址综合| 日本亚洲精品在线观看| 深夜福利日韩在线看| 国产精品情侣自拍| 成人免费高清完整版在线观看| 98精品国产高清在线xxxx天堂| 久久久久久12| 青青a在线精品免费观看| 成人免费xxxxx在线观看| 97香蕉久久夜色精品国产| 亚洲国产精品va在线看黑人动漫| 亚洲国产精品久久久久秋霞不卡| 午夜精品久久久久久久99黑人| 91日本视频在线| 国外成人在线视频| 国产精品2018| 亚洲第一页在线| 狠狠色狠狠色综合日日五| 2019中文字幕在线免费观看| 97视频在线免费观看| 亚洲国产日韩精品在线| 久久理论片午夜琪琪电影网| 免费91麻豆精品国产自产在线观看| 欧美综合第一页| 久久久久久久国产精品视频| 日本19禁啪啪免费观看www| 亚洲japanese制服美女| 自拍偷拍亚洲在线| 狠狠干狠狠久久| 亚洲自拍小视频| 国产日韩精品综合网站| 欧美精品激情在线观看| 欧美高清不卡在线| 亚洲午夜女主播在线直播| 隔壁老王国产在线精品| 日韩在线观看视频免费| 欧美野外猛男的大粗鳮| 欧美日韩在线另类| 日韩在线视频中文字幕| 久久精品亚洲94久久精品| 青青青国产精品一区二区| 亚洲第一视频网| 国产网站欧美日韩免费精品在线观看| 国产在线精品成人一区二区三区| 国产精品美女免费视频| 午夜精品福利在线观看| 久久久999国产| 97在线视频一区| 亚洲人成电影在线播放| 国产精品女人网站| 黄色一区二区三区| 日韩视频在线一区| 成人精品网站在线观看| 中文字幕日韩av综合精品| 国产精品尤物福利片在线观看| 久久伊人精品视频| 国产深夜精品福利| 午夜精品一区二区三区在线| 色妞色视频一区二区三区四区| 日韩欧美aⅴ综合网站发布| 91精品国产色综合久久不卡98口| 96国产粉嫩美女| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久免费视频在线观看| 亚洲乱亚洲乱妇无码| 国产精品一二三在线| 亚洲视频axxx| 97国产成人精品视频| 欧美性猛交xxxx乱大交极品| 亚洲精品福利免费在线观看| 国产精品日韩在线观看| 国产小视频91| 日韩成人在线视频观看| 亚洲国产精品电影在线观看| 亚洲国产精品va在线看黑人动漫| 国产脚交av在线一区二区| 色综合影院在线| 91精品国产91久久久久久不卡| 久久久久久久999| 国产精品久久久久久久久久三级| 国产亚洲aⅴaaaaaa毛片| 91av在线视频观看| 欧美国产一区二区三区| 亚洲无限乱码一二三四麻| 日韩精品一区二区视频| 亚洲国产精品99| www.亚洲天堂| 欧美日韩国产一区二区三区| www.亚洲成人| 国产精品免费久久久久久| 国产精品狠色婷| 日韩国产高清污视频在线观看| 久久91精品国产91久久久| 国产精品视频最多的网站| 国产精品视频男人的天堂| 久久成人一区二区| 国产精品视频播放| 国产精品视频精品视频| 欧美电影在线免费观看网站| 久久夜精品va视频免费观看| 97国产suv精品一区二区62| 久色乳综合思思在线视频| 美日韩精品视频免费看| 成人国产精品一区| 欧美日韩一区二区精品| 亚洲视频999| 亚洲网站在线播放| 免费91麻豆精品国产自产在线观看| 日韩精品福利网站| 国产精品电影观看| 国模吧一区二区| 精品日韩视频在线观看| 91久久精品视频| 欧美日韩国产精品一区二区不卡中文| 狠狠操狠狠色综合网| 精品高清美女精品国产区| 亚洲成人激情小说|