“不安全的过载”警告

时间:2018-12-05 17:43:00

标签: c# visual-studio-2019

我有以下代码:

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}',我仍然会收到警告。

1 个答案:

答案 0 :(得分:0)

通过查看documentation of the warning可以解释根本原因和许多可能的修复方法,但是它可以归结为所读取的XML可能包含对潜在不安全位置的DTD引用,并且精心制作的文档可能表示漏洞。从文档中:

  

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

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

返回您的代码,可以这样更改:

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

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