CA3076:不安全的 XSLT 脚本执行

属性
规则 ID CA3076
标题 不安全的 XSLT 脚本执行
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用

原因

如果在 .NET 应用程序中执行可扩展样式表语言转换(XSLT),处理器可能会解决不受信任的 URI 引用,这些引用可能会向攻击者披露敏感信息,从而导致拒绝服务和跨站点攻击。 有关详细信息,请参阅 XSLT 安全注意事项(.NET 指南)。

规则说明

XSLT 是万维网联合会 (W3C) 标准,用于转换 XML 数据。 XSLT 通常用于编写样式表,以将 XML 数据转换为其他格式,如 HTML、定长文本、以逗号分隔的文本或其他 XML 格式。 虽然默认情况下禁止,但可以选择为项目启用它。

为确保不暴露攻击面,每当 XslCompiledTransform.Load 接收 XsltSettingsXmlResolver的不安全组合实例时,则会触发此规则,这会允许处理恶意脚本。

如何解决冲突

何时禁止显示警告

除非确信已知道输入是来自受信任的源,否则请勿禁止显示此警告的规则。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

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

注释

从 .NET 10 开始,该 EnableScript 属性标记为已过时并生成警告 SYSLIB0062。 在 .NET (Core)上,不再需要显式将此属性设置为该属性 false ,因为不支持脚本执行。

另请参阅