【发布时间】:2020-02-26 01:31:53
【问题描述】:
我们的 C# 源代码的安全扫描报告“缺少 XML 验证”作为可能的注入漏洞。它引用了https://cwe.mitre.org/data/definitions/112.html 和其他来源。
它的建议是:
解析 XML 时始终启用验证。如果启用验证 导致问题,因为定义格式良好的文档的规则 是拜占庭式的或完全未知的,很有可能有 附近的安全错误。
示例:以下代码演示了如何在使用 XmlReader.XmlReader 时启用验证
Settings settings = new XmlReaderSettings(); settings.Schemas.Add(schema); settings.ValidationType = ValidationType.Schema; StringReader sr = new StringReader(xmlDoc); XmlReader reader = XmlReader.Create(sr, settings);
我有一个可用于验证的 XSD 架构。我的问题是,如何将 XSD 作为 XmlSchema 加载,而不会重复加载未经验证的 XML 文件的错误?
如果我从文件系统中读取 XSD,我想我只是在重复相同的错误(读取 XML 时没有验证)。有推荐的方法吗?
我们的第一种方法是从文件系统中读取 XSD,例如:
XmlTextReader xsdReader = new XmlTextReader("MySchema.xsd"));
XmlSchema schema = XmlSchema.Read(xsdReader, ValidationCallback);
但是,我相信这会导致同样的错误,读取 XML(在本例中为 XSD)而无需验证。
我们现在使用的方法(我认为可以通过安全扫描)是从嵌入式资源加载 XSD。
Stream xsdStream = Assembly.GetAssembly(typeof(MyType))
.GetManifestResourceStream("MyNamespace.MySchema.xsd");
if (xsdStream == null) throw ...
XmlSchema schema = XmlSchema.Read(xsdStream, ValidationCallback);
我们还没有重新扫描,但我怀疑嵌入式资源方法会通过。但是,是否有推荐或最佳实践方法?
【问题讨论】:
-
你能处理
settings.ValidationEventHandler吗?因此,首先读取架构,然后设置 XmlReaderSettings,然后使用 XmlReader 加载文档。 -
正确,但是将 XSD 加载为:XmlTextReader xsdReader = new XmlTextReader("MySchema.xsd")); XmlSchema 架构 = XmlSchema.Read(xsdReader, ValidationCallback);重复原始问题,读取 XML 而不进行验证。
-
您可以使用
XmlSchema schema; using (StringReader xsdReader = new StringReader(xsdPath)) { schema = XmlSchema.Read(xsdReader, null); }将null传递到读取中。然后你的 settings.ValidationEventHandler 正如我建议的那样验证这一点;类似:settings.ValidationEventHandler += (sender, args) => { if (args.Severity == XmlSeverityType.Error) throw new InvalidOperationException(args.Message); } -
我们很难确切知道您的安全漏洞扫描工具会反对什么。您是否测试过从this answer 到Adding (Embedded Resource) Schema To XmlReaderSettings Instead Of Filename? 的代码片段中的任何一个是否确实导致此扫描工具报错?
-
哦,但不要使用
XmlTextReader,根据docs,它已被弃用。请改用XmlReader.Create()。我隐约记得XmlTextReader有更多允许的默认设置来解析外部 URL,因此可能会被标记为不安全。
标签: c# .net xml xsd-validation