我们的静态代码分析器在一行上报告了不受限制的文档类型的安全问题XElement.Parse
。该方法的输入是某些 API 调用的结果。
根据文档,XDocument.Load
和的默认设置XElement.Load
是禁止 DTD 处理。尝试使用(外部)DTD 加载 xml 会导致运行时异常,表明出于安全原因,本文档中禁止使用 DTD。
我可以将相同的 XML 字符串传递给 XML.Parse。但在这种情况下不会抛出任何异常。文档表明它是在标准之上实现的XmlReader.Create
,所以我预计会出现相同的异常。
是否XElement.Parse
进行 DTD 处理,还是只是忽略 xml 声明和 DTD 信息?或者换句话说:我可以将问题标记为误报吗,还是应该更新代码并使用 XmlReader 并明确禁止 DTD 处理?
var xml = @"<?xml version=""1.0"" standalone=""no""?>
<!DOCTYPE serviceResponse SYSTEM ""serviceResponse.dtd"">
<serviceResponse>
<item>
<name>item 1</name>
</item>
</serviceResponse>";
var stringReader = new StringReader(xml);
var xmlReader = XmlReader.Create(stringReader);
XElement.Load(xmlReader);
抛出:
[System.Xml.XmlException: For security reasons DTD is prohibited in this XML document. To enable DTD processing set the DtdProcessing property on XmlReaderSettings to Parse and pass the settings into XmlReader.Create method.]
但这运行没有问题:
var xml = @"<?xml version=""1.0"" standalone=""no""?>
<!DOCTYPE serviceResponse SYSTEM ""serviceResponse.dtd"">
<serviceResponse>
<item>
<name>item 1</name>
</item>
</serviceResponse>";
XElement.Parse(xml);
没有记录
XmlReaderSettings
该Parse
函数的用途。但查看源代码,它调用
GetXmlReaderSettings
函数,该函数执行以下操作:所以是的,这个函数确实解析了 DTD,因此有些人认为它可能存在安全风险。你应该传递一个自定义的
XmlReader
。点网fiddle