共用方式為


System.Xml 程式碼撰寫方針

更新: November 2007

下列各節提供可用來協助保護 System.Xml 應用程式的一般方針。

注意事項:

System.Xml 元件依賴於 Microsoft .NET Framework 安全性系統。本主題僅會解決特別由 XML 類別處理的安全性問題。如需詳細資訊,請參閱 .NET Framework 中的安全性

安全性問題

安全性問題可分為三個泛用類別。

外部存取

有幾個 XML 技術能夠在處理期間擷取其他文件。例如,文件類型定義 (DTD) 可位於要剖析的文件中。DTD 還可以存在於要剖析之文件所參考的外部文件中。XML 結構描述定義語言 (XSD) 及 XSLT 技術還能夠包含其他檔案的資訊。這些外部資源會帶來一些安全性問題:

  • 您如何確保應用程式僅從信任的站台擷取檔案?例如,如果 XML 文件具有網際網路檔案的檔案參考,您要讓應用程式擷取此檔案嗎?

  • 如果擷取檔案,如何確保檔案不包含惡意資料?

阻斷服務

因為 XML 文件可以包含其他檔案的參考,所以很難判定需要多大的處理能力來剖析 XML 文件。例如,XML 文件可以包含 DTD。如果 DTD 包含巢狀實體或複雜的內容模型,則剖析文件會花費大量的時間。

下列案例較不易受阻斷服務的攻擊,因為 System.Xml 類別會提供保護免受此類攻擊的方法。若要瞭解使用 System.Xml 元件時會發生的安全性問題類型,以及如何減緩這些威脅的詳細資訊,請參閱 System.Xml 安全性考量

  • 剖析文字 XML 資料。

  • 如果二進位 XML 資料是由 Microsoft SQL Server 2005 產生的,請剖析二進位 XML 資料。

  • 將 XML 文件及片段從資料來源寫入檔案系統、資料流、TextWriterStringBuilder

  • 如果您正使用 XmlReader 物件,請將文件載入文件物件模型 (DOM) 物件,並將 ProhibitDtd 設為 true。

  • 巡覽 DOM 物件。

如果您擔心遭受阻斷服務攻擊,或正在不受信任的環境下工作,不建議您使用下列案例。

  • DTD 處理。

  • 結構描述處理。這包括將不受信任的結構描述加入結構描述集合、編譯不受信任的結構描述,以及使用不受信任的結構描述進行驗證。

  • XSLT 處理。

  • 剖析使用者提供之二進位 XML 資料的任意資料流。

  • DOM 作業,如查詢、編輯、在文件之間移動子樹狀目錄,以及儲存 DOM 物件。

當使用 XmlReader 時,您可以限制文件的大小,該文件可藉由設定 MaxCharactersInDocument 屬性來加以剖析。您可以藉由設定 MaxCharactersFromEntities 屬性來限制從擴充實體所產生的字元數目。如需設定這些屬性的範例,請參閱適當的參考主題。

處理

XSD 及 XSLT 技術具有可影響處理效能的其他功能。例如,評估很小的文件時,可能會建構需要大量時間進行處理的 XML 結構描述。還可能將指令碼區塊嵌入 XSLT 樣式表中。這兩種情況都會對您的應用程式造成潛在的安全性威脅。

外部資源

XmlUrlResolver 類別是 System.Xml 命名空間中所有類別的預設解析程式。它還可以用來載入 XML 文件、解析外部資源 (如實體、DTD 或結構描述) 及匯入或併入指示詞。

API 可讓您藉由指定要使用的 XmlResolver 物件來覆寫此類別。如果您需要開啟並不由您控制或不受信任的資源,請使用 XmlSecureResolver 類別。XmlSecureResolver 可包裝 XmlResolver,並可讓您限制基礎 XmlResolver 可存取的資源。

DTD 處理

如果您顧慮 DoS 問題或正在處理不受信任的來源,請勿啟用 DTD 處理。在 Create 方法建立的 XmlReader 物件上,預設會停用 DTD 處理。

注意事項:

依預設,XmlTextReader 允許 DTD 處理。使用 XmlTextReader.ProhibitDtd 屬性停用此功能。

如果已啟用 DTD 處理,則可使用 XmlSecureResolver 限制 XmlReader 可存取的資源。您還可以設計應用程式,以在記憶體及時間方面限制 XML 處理。例如,在 ASP.NET 應用程式中設定逾時限制。

XSLT 處理

建立使用 XslCompiledTransform 類別的應用程式時,您應留意下列項目及其含意:

  • 依預設會停用 XSLT 指令碼。僅當需要指令碼支援且在完全受信任的環境中運作時,才應啟用 XSLT 指令碼。

  • 依預設會停用 XSLT document() 函式。如果您啟用 document() 函式,則藉由傳遞 XmlSecureResolver 物件至 Transform 方法,限制可存取的資源。

  • 依預設會啟用擴充物件。如果將包含擴充物件的 XsltArgumentList 物件傳遞到 Transform 方法,則會加以利用。

  • XSLT 樣式表可以包含其他檔案及內嵌指令碼區塊的參考。居心不良的使用者會利用這一點,藉由提供您資料或樣式表,使您因執行他們而導致系統持續處理,直到電腦資源不足,來進行攻擊。

  • 在混合的信任環境中執行的 XSLT 應用程式,會產生用於詐騙的樣式表。例如,居心不良的使用者可載入含有害樣式表的物件,然後將其傳遞給另一使用者,該使用者隨後會呼叫 Transform 方法並執行轉換。

不啟用指令碼或 document() 函式 (除非樣式表來自信任的來源),不接受來自不受信任來源的 XslCompiledTransform 物件、XSLT 樣式表或 XML 來源資料,可減輕這些安全性問題。

例外狀況處理

較低層級元件所擲回的例外狀況會洩露您不想反昇至應用程式的路徑資訊。應用程式必須捕捉例外狀況並予以適當處理。

XmlTextWriter 用法

XmlTextWriter 傳遞到其他應用程式時,基礎資料流會對該應用程式公開。如果您需要將 XmlTextWriter 傳遞到非完全信任的應用程式,則應改為使用 Create 方法建立的 XmlWriter 物件。

請參閱

工作

HOW TO:使用 XmlSecureResolver 類別

其他資源

安全性和 System.Xml 應用程式