| 屬性 | 值 |
|---|---|
| 規則識別碼 | CA3076 |
| 職稱 | 不安全的 XSLT 指令碼執行 |
| 類別 | 安全性 |
| 修正程式是中斷或非中斷 | 不中斷 |
| 在 .NET 10 中預設啟用 | No |
原因
如果您在 .NET 應用程式中執行可延伸樣式表語言轉換 (XSLT) 不安全,處理器可能會解析不受信任的 URI 參考,這些參考可能會向攻擊者洩露敏感性資訊,從而導致阻斷服務和跨網站攻擊。 如需詳細資訊,請參閱 XSLT 安全性考量 (.NET 指南)。
檔案描述
XSLT 是全球資訊網協會 (W3C) 針對 XML 資料轉換的一項標準。 XSLT 通常用於撰寫樣式表單,將 XML 資料轉換成其他格式,例如 HTML、固定長度文字、逗號分隔文字或不同的 XML 格式。 雖然預設禁止,但您可以選擇為您的專案啟用它。
為了保障您不會公開受攻擊面,每當 XslCompiledTransform.Load 收到可執行惡意指令碼的 XsltSettings 和 XmlResolver不安全組合執行個體時,即會觸發此規則。
如何修正違規
- 將不安全的
XsltSettings引數 XsltSettings.Default 取代為停用文件函式和腳本執行的執行個體。 - 將 XmlResolver 引數取代為 null 或 XmlSecureResolver 執行個體。
隱藏警告的時機
如果您無法確定輸入是否來自受信任的來源,請不要隱藏這個警告的規則。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA3076
// The code that's violating the rule is on this line.
#pragma warning restore CA3076
[*.{cs,vb}]
dotnet_diagnostic.CA3076.severity = none
如需詳細資訊,請參閱 如何隱藏程式代碼分析警告。
虛擬程式代碼範例
使用 XsltSettings.TrustedXslt 的違規
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
void TestMethod()
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
var settings = XsltSettings.TrustedXslt;
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
}
}
}
使用 XsltSettings.Default 的解決方案
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
void TestMethod()
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
var settings = XsltSettings.Default;
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver);
}
}
}
違規 - 文件函式和文稿執行未停用
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
private static void TestMethod(XsltSettings settings)
{
try
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
}
catch { throw; }
finally { }
}
}
}
解決方案 — 停用檔函式和腳本執行
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
private static void TestMethod(XsltSettings settings)
{
try
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
settings.EnableDocumentFunction = false;
settings.EnableScript = false;
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver);
}
catch { throw; }
finally { }
}
}
}
備註
從 .NET 10 開始,屬性 EnableScript 會標示為過時,並產生警告 SYSLIB0062。 在 .NET (Core) 上,不再需要明確將此屬性設定為 false ,因為不支援腳本執行。