CA5372:将 XmlReader 用于 XPathDocument

属性
规则 ID CA5372
标题 将 XmlReader 用于 XPathDocument
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

使用未通过 XmlReader 对象实例化的 XPathDocument 类可能会导致拒绝服务、信息泄露和服务器端请求伪造攻击。 不受信任的 DTD 和 XML 架构处理使这些攻击成为可能,这使攻击者能在 XML 中包含 XML 炸弹和恶意的外部实体。 只有使用 XmlReader 才可以禁用 DTD。 从 .NET Framework 版本 4.0 开始,作为 XmlReader 的内联 XML 架构处理会默认将 ProhibitDtdProcessInlineSchema 属性设置为 false。 其他选项(例如 StreamTextReaderXmlSerializationReader)不能禁用 DTD 处理。

规则说明

处理来自不受信任的数据的 XML 时可能会加载危险的外部引用,可使用具有安全解析程序或禁用了 DTD 处理的 XmlReader 对其进行限制。 此规则检测使用 XPathDocument 类但不接受 XmlReader 作为构造函数参数的代码。

如何解决冲突

使用 XPathDocument(XmlReader, *) 构造函数。

何时禁止显示警告

如果 XPathDocument 对象用于处理来自受信任源的 XML 文件并且因此无法对其进行篡改,则可禁止显示此警告。

抑制警告

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

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

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

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

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

伪代码示例

冲突

下面的伪代码示例演示了此规则可检测的情况。 XPathDocument 的第一个参数的类型不是 XmlReader

using System.IO;
using System.Xml.XPath;
...
var obj = new XPathDocument(stream);

解决方案

using System.Xml;
using System.Xml.XPath;
...
public void TestMethod(XmlReader reader)
{
var obj = new XPathDocument(reader);
}