gpt4 book ai didi

C# 在不加载未经验证的 XSD 的情况下使用 XSD 验证 XML?

转载 作者:行者123 更新时间:2023-11-30 17:25:25 24 4
gpt4 key购买 nike

我们的 C# 源代码的安全扫描将“缺少 XML 验证”报告为可能的注入(inject)缺陷。它引用了https://cwe.mitre.org/data/definitions/112.html和其他来源。

它的建议是:

Always enable validation when you parse XML. If enabling validation causes problems because the rules for defining a well-formed document are Byzantine or altogether unknown, chances are good that there are security errors nearby.

Example: The following code demonstrates how to enable validation when using 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);

我们还没有重新扫描,但我怀疑嵌入式资源方法会通过。但是,对此是否有推荐或最佳实践方法?

最佳答案

任何能写下“如果启用验证会导致问题,因为定义格式良好的文档的规则是拜占庭式的”这句话的人都表明他们对 XML 知之甚少;似乎他们不理解有效和格式良好之间的区别,这是非常基本的。所以你必须找到绕过不太聪明的规则的方法。此时您必须决定您的目标是使系统更安全,还是通过安全测试。

很难看出启用验证会修复哪些安全漏洞。

特别是因为您可以编写接受任何文档为有效的模式,而且我敢打赌您的安全工具会很高兴地满足于您遵守规则,即使您没有增加一点安全性也是如此。

当模式处理器加载一个模式时,它会自动验证它是一个有效的模式。所以真的没有任何风险。但是,您的安全扫描器是否接受没有任何风险则完全是另一回事。

关于C# 在不加载未经验证的 XSD 的情况下使用 XSD 验证 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58630648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com