CA3076:不安全的 XSLT 指令碼執行

屬性
規則識別碼 CA3076
標題 不安全的 XSLT 指令碼執行
類別 安全性
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

如果您在 .NET 應用程式中以不安全的方式執行可延伸樣式表語言轉換 (XSLT),處理器可能會解析不受信任的 URI 參考,而這些參考可能會將機密資訊洩漏給攻擊者,導致拒絕服務和跨網站攻擊。 如需詳細資訊,請參閱 XSLT 安全性考慮(.NET 指南)。

檔案描述

XSLT 是全球資訊網協會 (W3C) 針對 XML 資料轉換的一項標準。 XSLT 通常用於撰寫樣式表單,將 XML 資料轉換成其他格式,例如 HTML、固定長度文字、逗號分隔文字或不同的 XML 格式。 雖然預設為禁止使用,您仍可以針對專案選擇啟用此項目。

為了保障您不會公開受攻擊面,每當 XslCompiledTransform.Load 收到可執行惡意指令碼的 XsltSettingsXmlResolver不安全組合執行個體時,即會觸發此規則。

如何修正違規

  • 將不安全的 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

如需詳細資訊,請參閱 如何隱藏程式代碼分析警告

虛擬程式代碼範例

使用 Xslt 的違規 設定。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
        }
    }
}

使用 Xslt 設定 的解決方案。預設

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 { }
        }
    }
}

另請參閱