CA3076:不安全的 XSLT 指令碼執行
屬性 | 值 |
---|---|
規則識別碼 | CA3076 |
職稱 | 不安全的 XSLT 指令碼執行 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 9 中啟用 | 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
若要停用檔案、資料夾或項目的規則,請在組態檔中將其嚴重性設定為 。none
[*.{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 { }
}
}
}