共用方式為


保護 Web 組件頁面

更新:2007 年 11 月

Web 組件是 ASP.NET 的新功能,可讓使用者修改或個人化 Web 網頁。對於 Web 應用程式的使用者而言,個人化的 Web 網頁的功能非常強大,但開發人員應該瞭解它也具有安全性含意。

Web 組件安全性問題

因為 Web 組件是 ASP.NET 的功能,且 Web 組件控制項是延伸的 ASP.NET 伺服器控制項,所以 Web 組件頁面很容易面臨與 ASP.NET 網頁面臨的所有風險。具有使用 Web 組件控制項之網頁的 Web 應用程式實際上就是一種特殊類型的 ASP.NET 應用程式,而使用 Web 組件的應用程式可以在可執行一般 ASP.NET 應用程式的任何信任層級中執行。如需 ASP.NET 網站安全性的一般資訊,請參閱 保護 ASP.NET 網站。不過,Web 組件具有一般 ASP.NET 網頁沒有的一些獨特的安全性問題。將在下列章節中描述這些問題。

匯入控制項資料

安全性風險最大的 Web 組件功能是匯入功能。這個功能可讓使用者匯入 XML 描述檔,該描述檔包含伺服器控制項的狀態和屬性資料 (控制項的組件檔必須已存在於 Web 伺服器上)。匯入控制項的資料可讓使用者共用資料並輕鬆設定複雜的控制項。但固有的風險是描述檔中可能存在惡意資料。例如,如果有人將惡意指令碼做為字串屬性的值置於描述檔中,則當使用者匯入描述檔並將所參考的伺服器控制項加入 Web 網頁時,該很可能會執行該指令碼。為了將匯入具有惡意資料之描述檔的風險降至最低,具有字串型別屬性的伺服器控制項應該永遠對屬性資料進行編碼。另一個風險涉及透過描述檔匯入型別 (請參閱 Web 組件控制項描述檔)。惡意使用者可能會送出要求,以將許多組件載入 AppDomain,從而導致耗用的記憶體過多。如果您想要避免與匯入關聯的風險,只需不使用實作該功能的伺服器控制項即可停用該功能。您也可以限制哪些使用者可以存取控制項。例如,您可以使用角色管理,且如果使用者處於管理員角色中,則可為該使用者以程式的方式將 ImportCatalogPart 加入網頁。如需控制項的詳細資訊,請參閱 ImportCatalogPart 類別的參考主題。

匯出控制項資料

匯出功能可能面臨的風險與匯入幾乎相同,因為它可以公開 (Expose) 敏感資料。匯出可讓使用者將特定控制項的屬性和狀態資料,儲存到 XML 描述檔 (這與使用匯入功能所匯入的檔案相同)。此處的主要風險是使用者可能會將敏感資料匯出應用程式之外,並匯出至描述檔,而該描述檔是簡單文字檔,具有適當使用權限的任何人都可以讀取之。在 ASP.NET 中預設會停用匯出,因此如果您不需要該功能,則可安全無虞地忽略它。這顯然是最安全的選擇。

如果您想要啟用匯出,則應注意決定可匯出屬性的選項。當建立將用於 WebPartZone 區域的 WebPart 或伺服器控制項時,對於您要允許匯出的每個公用屬性 (Property),您可以加入 Personalizable 中繼資料 (Metadata) 屬性 (Attribute)。如果已啟用匯出,這可讓屬性成為可匯出的,還會向使用者引發訊息方塊,警告將會匯出資料。Personalizable 屬性的其中一個參數稱為 IsSensitive。如果您要屬性在部分情況下可以匯出,但在其他情況下不可以匯出,則這個布林 (Boolean) 參數將非常有用。如需詳細資料和範例,請參閱 ExportMode 屬性的參考主題。

瞭解個人化詳細資料

Web 組件個人化是一種功能,可讓使用者修改 Web 網頁以適合其偏好設定,並將其設定儲存至長期儲存區中,以便個人化的網頁在瀏覽器各工作階段 (Session) 中保留設定。大部分 Web 組件功能都需要個人化,因此,ASP.NET 網站中預設會啟用該功能,儘管該功能僅用於包含 Web 組件控制項的網頁。因為個人化的功能如此強大,所以它也會帶來某種程度的風險。使用者可以在 Web 網頁上修改實際配置、外觀,甚至內容和控制項。因為個人化資料儲存在資料庫中並用於呈現網頁,所以使用者很可能執行與網站內容相關的惡意活動。存取共用個人化範圍的使用者甚至可以變更網頁顯示給所有使用者的方式。

如果您具有使用 Web 組件功能但不需要個人化的特定網頁 (例如入口網站中的其中一個一般網頁),則最好停用個人化,因為這樣做會提高性能並降低您網站面臨安全性風險的機會。如需詳細資訊,請參閱 HOW TO:停用 Web 組件個人化

為個人化驗證使用者

個人化需要已驗證的使用者。您無法為匿名使用者啟用個人化。這表示若要具有完整的個人化和 Web 組件功能,您的網站必須使用 Windows 或表單式驗證 (Authentication)。如需驗證選項的資訊,請參閱 ASP.NET Web 應用程式的基本安全性實務。若要使用新的成員資格功能 (該功能使用表單驗證) 設定站台,請參閱使用成員資格管理使用者

授與共用個人化的最小存取權限

Web 組件個人化變更一定會套用至指定範圍的使用者。使用者範圍中進行的變更只對執行變更的使用者可見,而共用範圍中進行的變更則對所有使用者可見。之所以存在共用個人化範圍,是為了讓管理員或管理角色中的使用者可變更套用至網站所有使用者的網頁。根據預設,會拒絕所有使用者存取共用範圍。只向選定使用者授與存取權限,且此動作必須在網站的組態檔中明確執行。如需詳細資訊,請參閱 HOW TO:啟用 Web 組件頁面的共用個人化

使用已測試和受信任的控制項

因為 Web 組件為使用者提供強大的功能 (例如將新伺服器控制項加入網頁的能力),所以開發人員應該對在 Web 組件應用程式內使用哪些控制項非常謹慎。您應該認真檢閱和測試伺服器控制項,特別是來自協力廠商或廠商的伺服器控制項,以確保可以信任它們能夠用於 Web 組件應用程式。例如,假設特定伺服器控制項的設計不合理,且其記憶體使用方式效率不佳。如果您將該控制項加入 Web 組件目錄,則使用者可將其加入 Web 網頁。因為目錄中的控制項可加入網頁任意次 (多個執行個體 (Instance)),所以使用者可能會多次加入效能較差的控制項,如此一來,當網頁嘗試處理控制項的眾多執行個體時,就會有效地產生拒絕服務攻擊。如需 Web 組件目錄的詳細資訊,請參閱 CatalogPart 類別的參考主題。

對控制項使用授權和篩選

Web 組件的功能可讓您設定和檢查用於建立 Web 組件頁面的使用者介面 (UI) 之伺服器控制項的授權層級。如果根據您所設定的準則授權控制項,則會在網頁上顯示該控制項。如果在某個較低的層級授權控制項,或根本不授權控制項,則您可以相應地變更其外觀,或完全將其隱藏。例如,假設將您的使用者指定為管理員。可能有一個您只想讓管理員看到的伺服器控制項。藉由使用 Web 組件的授權和篩選功能,您可以確定這個控制項只顯示給指定的管理員,而對其他使用者隱藏。使用授權和篩選的主要機制是 WebPart 類別的 AuthorizationFilter 屬性,以及 WebPartManager 類別的 IsAuthorizedOnAuthorizeWebPart 方法。

對編輯控制項中的字串型別屬性進行編碼

Web 組件的一個獨特功能是,使用者可以將網頁切換為編輯模式,並可藉由變更伺服器控制項的配置、外觀、行為及其可個人化的屬性值,編輯伺服器控制項。但這個功能會帶來一些風險,因為惡意使用者可能會使用編輯字串型別屬性的能力,插入不適當的資料或嘗試進行指令碼插入 (Script Injection) 攻擊。做為安全性實行方式,如果您建立自訂 EditorPart 控制項以編輯伺服器控制項,且指定伺服器控制項中的任何可個人化屬性具有字串型別或使用字串轉換子,則您的 EditorPart 控制項應在將字串資料指派給屬性時先對其進行編碼。如需範例,請參閱 HtmlEncode 方法的參考文件。

請參閱

參考

System.Web.UI.Design.WebControls.WebParts

其他資源

ASP.NET Web 組件控制項