我们的C#源的安全扫描报告说,“缺少XML验证”是一个可能的注入缺陷。它引用了https://cwe.mitre.org/data/definitions/112.html和其他消息来源。
它的建议是:
总是在解析XML时启用验证。如果启用验证会导致问题,因为定义格式良好的文档的规则是拜占庭式的,或者完全未知,那么很可能附近有安全错误。
示例:下面的代码演示如何在使用XmlReader.XmlReader时启用验证
设置=新XmlReaderSettings();settings.Schemas.Add(模式);settings.ValidationType = ValidationType.Schema;StringReader sr = new StringReader(xmlDoc);XmlReader reader = XmlReader.Create(sr,设置);
我有一个可供验证的XSD模式。我的问题是,如何以XmlSchema的形式加载XSD,而不重复在没有验证的情况下加载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);
我们还没有重新定位,但我怀疑嵌入资源的方法将会通过。但是,是否有建议或最佳做法来解决这一问题?
发布于 2019-10-30 13:58:59
任何会写“如果启用验证会导致问题,因为定义格式良好的文档的规则是拜占庭式”的人都会透露,他们对XML知之甚少;似乎他们不理解有效和格式良好之间的区别,这是非常基本的。所以你必须想办法绕过那些不太聪明的规则。此时,您必须决定您的目标是使系统更安全,还是通过安全测试。
通过启用验证,很难看出哪些安全漏洞将被修复。
特别是因为您可以编写一个模式,它可以接受任何文档为有效,而且我敢打赌,您的安全工具会很高兴地满足于您正在遵守规则,即使您还没有增加一小部分安全性。
当架构处理器加载架构时,它会自动验证它是否是有效的架构。所以真的没有任何风险。但是,您的安全扫描器是否承认没有任何风险,则完全是另一回事。
https://stackoverflow.com/questions/58630648
复制