XSLT 安全性考量
更新: November 2007
XSLT 語言具有一組豐富的功能,可讓您擁有強大的能力與彈性。它還包含許多可由外部來源利用的功能 (若有幫助)。若要安全使用 XSLT,您必須瞭解使用 XSLT 時會出現的各種安全性問題,以及為了減緩這些危險可使用的基本策略。
XSLT 擴充
兩個普遍使用的 XSLT 擴充為樣式表指令碼及擴充物件。這些擴充允許 XSLT 處理器執行程式碼。
擴充物件會將程式設計功能加入至 XSL 轉換。
指令碼可透過 msxsl:script 擴充項目內嵌在樣式表中。
擴充物件
擴充物件可透過 AddExtensionObject 方法加入。FullTrust 使用權限集合必須支援擴充物件。這會確保在執行擴充物件程式碼時不會提高使用權限。嘗試呼叫沒有 FullTrust 使用權限的 AddExtensionObject 方法,會導致擲回安全性例外狀況。
樣式表指令碼
指令碼可透過 msxsl:script 擴充項目內嵌在樣式表中。指令碼支援是 XslCompiledTransform 類別上的選擇性功能 (預設為停用)。可透過將 XsltSettings.EnableScript 屬性設為 true,並將 XsltSettings 物件傳遞至 Load 方法,即可啟用指令碼。
方針
僅在樣式表來自受信任來源時啟用指令碼。如果無法驗證樣式表的來源,或樣式表不是來自受信任來源,請傳入 null 做為 XSLT 設定引數。
外部資源
對於 XSLT 語言的某些功能 (如 xsl:import、xsl:include 或 document() 函式),處理器需要解析 URI 參考。XmlResolver 類別可用於解析外部資源。在下列兩種情況下,可能需要解析外部資源:
編譯樣式表時,會使用 XmlResolver 進行 xsl:import 及 xsl:include 解析。
執行轉換時,會使用 XmlResolver 解析 document() 函式。
注意事項: document() 函式在 XslCompiledTransform 類別上預設為停用。可透過將 XsltSettings.EnableDocumentFunction 屬性設為 true,並將 XsltSettings 物件傳遞至 Load 方法,即可啟用此功能。
Load 及 Transform 方法都包含多載,可接受 XmlResolver 做為其中一個引數。如果未指定 XmlResolver,則會使用沒有任何認證的預設 XmlUrlResolver。
方針
僅在樣式表來自受信任來源時啟用 document() 函式。
下列清單說明何時您可能想要指定 XmlResolver 物件:
如果 XSLT 處理序需要存取需要驗證的網路資源,可使用具有必要認證的 XmlResolver。
如果要限制 XSLT 處理序可存取的資源,您可使用具有正確使用權限集合的 XmlSecureResolver。如果您需要開啟不是由您控制或不受信任的資源,請使用 XmlSecureResolver 類別。
如果要自訂行為,可實作自己的 XmlResolver 類別,然後使用它來解析資源。
如果要確保不存取任何外部資源,您可對 XmlResolver 引數指定 null。