【问题标题】:"An insecure overload of" warning“不安全的过载”警告
【发布时间】:2018-12-05 17:43:00
【问题描述】:

我有以下代码:

using (FileStream fs = new FileStream(path_to_xml, FileMode.Open))
{
    using (XmlReader xr = XmlReader.Create(fs))
    {
        // Do something with xr
    }
}

我收到警告

CA3075:XmlReader.Create 的不安全重载不接受 一个 XmlReaderSettings 参数

如果我更改 Create 语句并像这样添加 XmlReaderSettings:

using (XmlReader xr = XmlReader.Create(fs, new XmlReaderSettings()))

我收到警告

CA3075:提供了可能不安全的 XmlReaderSettings 实例 到 XmlReader.Create 方法。

这个警告的真正原因是什么?让它消失的正确方法是什么?

我正在使用 VS 2019 Preview 1.0

我以前从未见过这个警告,所以也许它是 VS 2019 的新警告?

更新:我已经查看了此页面 https://docs.microsoft.com/en-us/visualstudio/code-quality/ca3075-insecure-dtd-processing?view=vs-2017,并且大多数解决方案都说要设置 'XmlReaderSettings(){ DtdProcessing = DtdProcessing.Prohibit }',但我仍然收到警告。

【问题讨论】:

  • This 可能是重复的。该问题尚未标记为已修复。
  • @JeroenMostert 对此表示感谢。您可能在这里有所收获!

标签: c# visual-studio-2019


【解决方案1】:

查看documentation of the warning 解释了根本原因和许多可能的修复,但归结起来,正在读取的 XML 可能包含对潜在不安全位置的 DTD 引用,并且精心制作的文档可能代表漏洞。来自文档:

如果您使用不安全的 DtdProcessing 实例或引用外部实体源,解析器可能会接受不受信任的输入并将敏感信息泄露给攻击者。

问题在于 XmlReader 和 XmlReaderSettings 类的默认设置都允许这种行为。由于默认设置会出现此问题,您需要明确设置为安全选项,最终归结为将DtdProcessing 设置为DtdProcessing.ProhibitXmlResolver 设置为XmlSecureResolver

回到你的代码,可以这样修改:

using (XmlReader xr = XmlReader.Create(fs, new XmlReaderSettings() { DtdProcessing = DtdProcessing.Prohibit }))

using (XmlReader xr = XmlReader.Create(fs, new XmlReaderSettings() { XmlResolver = new XmlSecureResolver() }))

【讨论】:

  • 我尝试了这两个示例,但仍然收到警告。第二个需要构造函数中的参数。
  • 第二个例子不能工作,因为XmlSecureResolver 的所有构造函数都需要参数(source)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多