- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们对代码进行了安全审核,他们提到我们的代码容易受到外部实体 (XXE) 攻击。我正在使用以下代码 -
string OurOutputXMLString=
"<ce><input><transaction><length>00000</length><tran_type>Login</tran_type></transaction><user><user_id>ce_userid</user_id><subscriber_name>ce_subscribername</subscriber_name><subscriber_id>ce_subscriberid</subscriber_id><group_id>ce_groupid</group_id><permissions></permissions></user><consumer><login_details><username>UnitTester9</username><password>pDhE5AsKBHw85Sqgg6qdKQ==</password><pin>tOlkiae9epM=</pin></login_details></consumer></input></ce>"
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(OurOutputXMLString);
在审计报告中,他们说它失败了,因为 XML 实体可以包含可以在预期控制之外解析的 URL。 XML 实体解析器将尝试解析和检索外部引用。如果可以将攻击者控制的 XML 提交给其中一个函数,那么攻击者就可以访问有关内部网络、本地文件系统或其他敏感数据的信息。为避免这种情况,我编写了以下代码,但它不起作用。
MemoryStream stream =
new MemoryStream(System.Text.Encoding.Default.GetBytes(OurOutputXMLString));
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.MaxCharactersFromEntities = 6000;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
但是我可以在这里看到 reader 没有任何值可以加载到 xmlDoc(XmlDocument)
中。任何人都可以在我遗漏的地方提供帮助吗?
最佳答案
外部资源使用通过 XmlDocument.XmlResolver
属性提供的 XmlResolver
进行解析。如果您的 XML 文档**不应包含任何外部资源**(例如 DTD 或模式),只需将此属性设置为 null
:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(OurOutputXMLString);
如果您想过滤这些 URL 的来源(例如只允许某些域),只需从 XmlUrlResolver
派生您自己的类并覆盖 ResolveUri()
方法.在那里,您可以检查 URL 是什么并对其进行清理(例如,您可以只允许本地网络内的 URL 或来自受信任来源的 URL)。
例如:
class CustomUrlResovler : XmlUrlResolver
{
public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
Uri uri = new Uri(baseUri, relativeUri);
if (IsUnsafeHost(uri.Host))
return null;
return base.ResolveUri(baseUri, relativeUri);
}
private bool IsUnsafeHost(string host)
{
return false;
}
}
其中 IsUnsafeHost()
是一个自定义函数,用于检查给定主机是否被允许。参见 this post这里有一些想法。只需从 ResolveUri()
返回 null
即可保存您的代码免受此类攻击。如果允许 URI,您可以简单地返回默认的 XmlUrlResolver.ResolveUri()
实现。
使用方法:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = new CustomUrlResolver();
xmlDoc.LoadXml(OurOutputXMLString);
有关如何解析 XML 外部资源的更多详细信息,请阅读 Resolving External Resources在 MS 文档上。如果您的代码比这个示例更复杂,那么您绝对应该阅读 Remarks section对于XmlDocument.XmlResolver属性(property)。
关于c# - 如何防止 XXE 攻击(.NET 中的 XmlDocument),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14230988/
我有一个 XmlDocument 并获取对象的字节如下: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("C:\\myxml.xml"); b
我创建了一个具有一个节点的基本 XmlDocument: XmlDocument bigDoc = new XmlDocument(); bigDoc.LoadXml(""); 我得到了另一个 Xml
我刚刚在使用 XmlDocument.LoadXml 时遇到问题。 应用程序崩溃,出现以下错误: "Data at the root level is invalid. Line 1, positio
我想知道执行以下操作的最佳方法是什么: 目录“Input.xml”和“Metadata.xml”中有 2 个 XML 文件。 输入.xml: 1 Test
我使用以下 VB.NET 代码将一些 XML 转换为新的 XML,然后继续处理。这是一次性过程,而不是多次完成的过程,因此据我所知,缓存不会提高效率。 代码有效,但我发现性能问题。我知道性能问题可能与
我有两个 XmlDocuments。像这样的东西: 和 我想将 document2 放在 document1 的内部节点中,这样我最终得到一个包含以下内容的文档:
我已经尝试了一些将新子添加到 XML 文件的代码。我注意到使用 XmlDocument.Load(String filename) 和 XmlDocument.Load(FileStream fs)
当我使用 TXMLDocument 加载 XML 时,元素不包含任何值。我阅读了以下 example file带有元素 TOSL108 ,它确实找到了节点,但它不将其识别为文本元素并且值为空且没有子元
我正在尝试处理 uwp 应用程序中的 xml,我添加了引用和用法: using System.Xml; using System.Xml.XPath; 但是 private XmlDocument d
我试图找出 CreateDocumentType() 在 C# 中的工作原理,虽然我已经找到并阅读了它的 msdn 页面,但我无法让它为我工作。 我只是想在我的 xml 文档中创建这一行: 谁能帮我
我有以下代码: var xmlString = ajaxRequest.responseText.toString(); parser = new DOMParser() doc = parser.p
我相信我的一些使用 XmlDocument 类的代码存在内存泄漏。 我的程序在 Windows 6.1.4 设备 (C#) 上运行并从另一台服务器上的数据库中读取以查看是否需要卸载设备上安装的任何程序
我正在使用流创建 XmlDocument 并在 XmlDocument 中进行一些更改并将 XmlDocument 保存到流本身。 XmlDocument xmlDocument = new XmlD
我想处理 XML 文档,并在 Foundation 包中找到了 XMLDocument 类,这似乎足以满足我的目的。但是我在使用它时遇到了一些问题。我有以下 Swift 代码: import UIKi
我有一堆与 XmlDocument 的空格处理相关的问题.请参阅下面示例中的编号评论。 在混合模式下,所有空格都不应该有意义吗?为什么 a 标签之间的空格不重要? 虽然我知道实际的空白元素仍然是 Xm
我目前必须遍历大量的 .xml 文件,并且绑定(bind)到 Mono(所以没有全新的 .NET LINQ 等)。 我用 XmlDocument加载每个 XML 文件,现在我的问题是,我可以为所有文件
我目前正在使用 Xmldocument 读取一个 xml 文件并写入一些值。我正在阅读的部分看起来像这样: Windows 3
我使用 XmlDocument.Load() 解析从嵌入式资源中读取的 XML 文本。有包含多行的文本元素。我读过 XML 解析器应该规范化换行符,将 CR-LF 对转换为单个 LF 字符。但我发现在
我有一个简单的 c# 函数,它创建一个基本的 XML 文件并保存: private void CreateXMlFile(string Filename, string Name, string Co
为了在SoapException.Detail中返回有用的信息对于 asmx web 服务,我从 WCF 中汲取灵感并创建了一个故障类来包含上述有用信息。然后将该故障对象序列化为所需的 XmlNode
我是一名优秀的程序员,十分优秀!