CA3076:不安全的 XSLT 脚本执行

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

原因

如果在 .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

有关详细信息,请参阅如何禁止显示代码分析警告

伪代码示例

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

另请参阅