查看此处解析的 XML 是不是来自受信任的来源,否则将 settings.DtdProcessing 设置为 System.Xml.DtdProcessing.Prohibit 或 .Ignore

Posted

技术标签:

【中文标题】查看此处解析的 XML 是不是来自受信任的来源,否则将 settings.DtdProcessing 设置为 System.Xml.DtdProcessing.Prohibit 或 .Ignore【英文标题】:Review that the XML parsed here is from a trusted source, otherwise set settings.DtdProcessing to System.Xml.DtdProcessing.Prohibit or .Ignore查看此处解析的 XML 是否来自受信任的来源,否则将 settings.DtdProcessing 设置为 System.Xml.DtdProcessing.Prohibit 或 .Ignore 【发布时间】:2019-09-04 15:48:08 【问题描述】:

规则: 不允许 XmlTextReader 上的 Dtd

类别: Microsoft.Security.Xml

检查 ID: CA3054

规则说明: 在不受信任的源上使用 XmlTextReader 时禁止 DTD 处理。在 XML 阅读器上启用 DTD 处理并使用 UrlResolver 解析外部 XML 实体可能会导致信息泄露。来自文件系统或网络共享的内容 处理 XML 的机器可能会暴露给攻击者。此外,攻击者可以将其用作 DoS 向量。

规则文件: securityxmlrules.dll [14.0.0.0]

帮助: http://go.microsoft.com/fwlink/?LinkId=282614&clcid=0x409

            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Prohibit;
            StringReader stringReader = new StringReader(xml);
            XmlTextReader reader = new XmlTextReader(stringReader);
            XmlDocument doc = new XmlDocument();
            doc.Load(reader);

            XmlAttributeCollection attrs = doc.DocumentElement.Attributes;

            if (!string.IsNullOrWhiteSpace(cookie))
            
                string pagingcookie = GetPagingCookie(cookie);
                if (!string.IsNullOrWhiteSpace(pagingcookie))
                
                    XmlAttribute pagingAttr = doc.CreateAttribute("paging-cookie");
                    pagingAttr.Value = pagingcookie;
                    attrs.Append(pagingAttr);
                
            

如何为 SDL 解决这个 FxCop

【问题讨论】:

【参考方案1】:

您创建了一个设置对象,但您的 XmlReader 实际上并未使用它。您需要使用设置创建一个 XmlReader。

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
StringReader stringReader = new StringReader(xml);
XmlReader reader = XmlReader.Create(stringReader, settings);

【讨论】:

以上是关于查看此处解析的 XML 是不是来自受信任的来源,否则将 settings.DtdProcessing 设置为 System.Xml.DtdProcessing.Prohibit 或 .Ignore的主要内容,如果未能解决你的问题,请参考以下文章

使用 SnakeYAML 从不受信任的来源加载 YAML 文件时会发生啥?

添加受信任的提供者 (SAML 2.0) 时遇到问题:无法解析我的服务提供者元数据

Youtube IFrame API 不受信任的来源

如何检测 IE 是不是将我的站点作为受信任站点访问?

登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。

Microsoft SQL Server登录失败,该登录名来自不受信任的域,不能与Windows`