.NET 方法XmlSerializer.Deserialize(TextReader)
对 XML 漏洞(XXE、XmlBomb 等)是否安全?反序列化期间是否会处理 DTD?
我可以理解为什么XmlSerializer.Deserialize(XmlTextReader)
如果XmlTextReader.DtdProcessing
设置为DtdProcessing.Parse
. 但是,当我们使用 TextReader 时,它是否也不安全?
.NET 方法XmlSerializer.Deserialize(TextReader)
对 XML 漏洞(XXE、XmlBomb 等)是否安全?反序列化期间是否会处理 DTD?
我可以理解为什么XmlSerializer.Deserialize(XmlTextReader)
如果XmlTextReader.DtdProcessing
设置为DtdProcessing.Parse
. 但是,当我们使用 TextReader 时,它是否也不安全?
查看 XmlSerializer.Deserialize 代码
XmlSerializer.Deserialize(TextReader) 在内部调用另一个覆盖 - XmlSerializer.Deserialize(XmlTextReader) 并将 XmlResolver 设置为 null,因此它应该免受 XXE 攻击,但是如果您想完全禁用 dtd 处理,则应使用下面的代替。
var xmlTextReader = new XmlTextReader(xmlInput) { DtdProcessing = DtdProcessing.Ignore/Prohibit };
xmlSerializer.Deserialize(xmlTextReader);
但是,我认为完全禁用 DTD 处理没有任何好处(尤其是当它可能会影响您经过时间测试的代码时)。据我了解,只有两种 xml 攻击 - XXE 和 XmlBomb。
如前所述,XXE 应该是不可能的,因为 XmlResolver 设置为 null。
XmlBomb 也应该是不可能的,因为 MaxCharactersFromEntities 设置为有限值而不是 0(0 表示无限制)。如果您确实尝试了这种攻击,您将面临一个异常提示 - “输入文档已超出 MaxCharactersFromEntities 设置的限制”。而不是让应用程序崩溃或遭受 DoS 攻击。