保护 ASP.NET Web 部件页面
Web 部件是 ASP.NET 的一個新特征,它提供給終端用戶對 Web 頁面進行更改或個性化的能力。擁有已個性化的 Web 頁面是非常強大的 Web 應用程序,但是它同樣有需要被開發(fā)者所了解的安全隱患。
Web 部件的安全問題
因為 Web 部件是 ASP.NET 的一個特征,并且 Web 部件的控件擴展了 ASP.NET 服務器控件,所以 Web 部件頁面會受到與 ASP.NET 頁面相同的安全影響。擁有使用 Web 部件控件的頁面的 Web 應用程序才是真正特殊的 ASP.NET 應用程序類型,并且使用 Web 部件的應用程序能夠在任何被信任級別中運行(與普通的 ASP.NET 應用程序一樣)。關于 ASP.NET 網站安全的詳細內容,請參考“ASP.NET 網站安全”。但是,Web 部件還有唯一的一個安全問題是常規(guī) ASP.NET 頁面所沒有的。這些問題在下列部分被討論。
導入控件的數據
Web 部件特征最大的安全隱患就是導入特征。這個特征允許用戶導入一個為服務器控件(控件的匯編集文件必須對于 Web 服務器是可用的)包含狀態(tài)和屬性數據的 XML 描述文件。為控件導入數據是用戶共享數據并簡化控件配置的一個方法。但是內在的隱患就是描述文件中有可能包含惡意數據。例如,如果有人把惡意腳本代碼保存到字符串屬性值中,然后當用戶導入描述文件并在 Web 頁面中引用服務器控件的時候,惡意腳本就會被潛在地得到執(zhí)行。要最小化這個隱患(導入包含惡意數據的描述文件),擁有字符串屬性的服務器控件應該始終對屬性的數據進行編碼。另一個隱患則是使用描述文件(參考“Web 部件控件的描述文件”)來導入數據。某個惡意用戶可以通過提交請求的方式把多個匯編集同時裝載到 AppDomain 中,從而導致額外的內存消耗。如果你需要避免這個隱患(與導入操作相關聯(lián)),你可以通過不使用實現了該操作的相關服務器控件的方式來對這個特征進行禁用。或者你可以對能夠訪問這些控件的用戶進行限制。例如,你可以使用角色管理,如果某個用戶屬于管理員角色,那么你可以通過編程為該用戶在頁面中添加 ImportCatalogPart。更多關于這些控件的信息,請參考 ImportCatalogPart 類的參考主題。
導出控件的數據
導出特征是另一個比較重要的安全隱患,因為它能夠暴露機密數據。導出特征允許用戶把特定控件的屬性和狀態(tài)數據導出到一個 XML 描述文件中。(這個文件就是導入特征所使用的文件。)主要的隱患就是用戶可以把機密數據導出到應用程序之外以及描述文件中(描述文件是能夠被擁有適當權限的任何用戶所讀取的簡單文本文件)。導出特征在 ASP.NET 中默認時是被禁用的,所以如果你不需要這個特征,你可以安全地忽略它。這很明顯是最大的安全選項。
如果你需要啟用導出特征,你應該對這個選項所能夠暴露出的屬性范圍進行了解。當你創(chuàng)建一個 WebPart 或者將在 WebPartZone 區(qū)域中使用的服務器控件的時候,你可以為每一個能夠被導出的公共屬性添加 Personalizable 元數據參數。該參數用于建立可導出的屬性,并且它同樣也會引發(fā)消息框給用戶,并對數據將要被導出的操作而進行警告。使用 Personalizable 參數建立的一個典型參數就是 IsSensitive 參數。這個布爾值參數有助于建立一個需要在某些情況下能夠被導出的屬性,關于細節(jié)和具體實例,請參考“ExportMode 屬性”的參考主題。
了解個性化的細節(jié)
Web 部件的個性化特征用來允許用戶按照他們的喜好而對 Web 頁面進行更改,并把他們的設定值進行長期保存,所以已個性化的頁面會保留跨瀏覽器會話之間的設定。多數 Web 部件特征都需要個性化;因此,它在 ASP.NET 網站中默認時是被啟用的。即使個性化是如此強大的特征,但是它同樣承運著一定的危險度。用戶能夠更改 Web 頁面的實際布局、外觀、甚至是頁面中的內容和控件。這些個性化的數據被保存在一個數據庫中并且用于頁面的呈現,所以用戶有許多的機會與網站內容進行惡意的交互。訪問已共享個性化范圍的用戶甚至能夠對應用于所有用戶的頁面進行更改。
如果你有一個使用 Web 部件特征但是并不需要進行個性化的特定頁面(例如,門戶網站中的某個公共頁面),對于禁用個性化來說這是一個很好的例子,因為這樣做提高了性能并為你的網站減少了暴露安全隱患的機會。
為個性化而驗證用戶
個性化需要對用戶進行驗證。你不能夠為匿名用戶啟用個性化。這表示如果要擁有完整的個性化和 Web 部件的功能,你的網站就必須使用基于 Windows 或者基于窗體的驗證機制。關于驗證選項的信息,請參考“Web 應用程序的基本安全練習(Visual Studio)”。要使用新的成員資格特征(使用窗體驗證)來設立網站,請參考“通過使用成員資格來管理用戶”。
準許訪問已共享個性化時的最小訪問權限
Web 部件的個性化改變始終應用到給定范圍或者個性化范圍中的用戶。在用戶范圍中所作的改變僅對作出改變的當前用戶可見,然而在已共享范圍中所作的改變則對所有用戶都是可見的。現有已共享個性化范圍中的管理員角色用戶對頁面所作的改變都會應用到網站中的所有用戶。默認時,所有用戶不允許對已共享范圍進行訪問。只有被選擇的用戶才擁有這個權限,這個限制是在網站的配置文件中被定義的。關于詳細內容,請參考“ASP.NET 實踐:為 Web 部件頁面啟用已共享的個性化”。
使用已測試的被信任控件
因為 Web 部件為用戶提供了強大的能力(如在頁面中添加新的服務器控件的能力),開發(fā)者應該要在 Web 部件應用程序中使用服務器控件的時候要特別的留意。因為服務器控件,特別是來自于第三方開發(fā)團體或者賣主的控件,應該小心地對其進行檢查和測試,以確保它們能夠被信任并用于 Web 部件應用程序中。例如,被惡意設計并且內存使用效率低下的一個特定服務器控件。如果你只要把這樣一個控件添加到 Web 部件的目錄中,用戶也就能夠把它添加到 Web 頁面中。并且因為目錄中的控件能夠被無數次地添加到頁面中(出現相同控件的多個實例),用戶也就能夠多次地在頁面中添加這樣一個劣質控件,那么在頁面嘗試處理劣質控件的多個實例的時候就會造成應用程序出現拒絕服務攻擊的現象。關于 Web 部件目錄的更多信息,請參考“CatalogPart 類”的參考主題。
在控件中使用授權和過濾
Web 部件有一個允許你在 Web 部件頁面中為創(chuàng)建用戶界面(UI)的服務器控件而對授權級別進行設置并檢查的特征。如果有一個基于標準(你所定義的標準)的已授權控件,它將出現在頁面中,并且如果它在某些簡化的級別中得到授權,因此你可以對它的外觀進行改變、或者完全隱藏它。例如,假設你有一個用戶并已經被指派成為管理員。同時有一個你需要僅對該管理員可見的服務器控件。通過使用 Web 部件的授權和過濾特征,你可以確定該控件只對被指派的管理員可見,而對其他用戶則不可見。使用授權和過濾主要的機制就是 WebPart 類的 AuthorizationFilter 屬性,還有 WebPartManager 類的 IsAuthorized 屬性和 OnAuthorizeWebPart 方法。
在編輯控件中對字符串屬性進行編碼
Web 部件的唯一的一個特征就是終端用戶可以把頁面轉換進編輯模式,并且他們可以編輯服務器控件,來改變它們的布局、外觀、行為、以及可個性化的屬性值。但是這樣做存在一些安全隱患,因為通過使用字符串屬性的編輯能力,某個惡意的用戶可以插入錯誤的數據、或者嘗試腳本注入式攻擊。作為一個安全練習,如果你創(chuàng)建了自定義的 EditorPart 控件來編輯服務器控件,并且該控件中還擁有使用給定服務器控件或者使用字符轉換器的一個可個性化字符串屬性,那么你的自定義 EditorPart 控件應該在指派到屬性之前對字符串的數據進行編碼。關于具體實例,請參考“HtmlEncode 方法”的參考文檔。
轉載于:https://www.cnblogs.com/Laeb/archive/2007/01/05/612737.html
總結
以上是生活随笔為你收集整理的保护 ASP.NET Web 部件页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回首七年间(尾)
- 下一篇: 全套 ArcGIS 软件安装(Windo