CA3076:不安全的 XSLT 脚本执行

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

原因

如果在 .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 ,因为不支持脚本执行。

另请参阅