CA3077:API 设计、XML 文档和 XML 文本读取器中的不安全处理

属性
规则 ID CA3077
标题 API 设计、XML 文档和 XML 文本读取器中的不安全处理
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

当设计派生自 XMLDocument 和 XMLTextReader 的 API 时,请注意 DtdProcessing。 当引用或解析外部实体源或设置 XML 中的不安全值时,使用不安全的 DTDProcessing 实例可能会导致信息泄露。

规则说明

XML 分析器可以通过两种方式确定文档有效性,文档类型定义 (DTD) 是其中一种(根据万维网联合会 (W3C) 可扩展标记语言 (XML) 1.0 的定义)。 此规则查找接受不受信任数据的某些属性和实例以提醒开发人员有关的潜在 Information Disclosure 威胁,该威胁可能会导致 拒绝服务 (DoS) 攻击。 在以下情况下触发此规则:

  • XmlDocumentXmlTextReader 类使用默认解析程序值进行 DTD 处理。

  • 没有为 XmlDocument 或 XmlTextReader 派生类定义的构造函数或没有用于 XmlResolver的安全值。

如何解决冲突

  • 正确捕获和处理所有 XmlTextReader 异常以避免路径信息泄露。

  • 使用 XmlSecureResolver 而不是 XmlResolver 来限制 XmlTextReader 可访问的资源。

何时禁止显示警告

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

抑制警告

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

#pragma warning disable CA3077
// The code that's violating the rule is on this line.
#pragma warning restore CA3077

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA3077.severity = none

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

伪代码示例

冲突

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass () {} // warn
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2() // warn
        {
        }
    }
}

解决方案

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass ()
        {
            XmlResolver = null;
        }
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2()
        {
               XmlResolver = null;
        }
    }
}