gpt4 book ai didi

c# - 如何防止 XXE 攻击(.NET 中的 XmlDocument)

转载 作者:IT王子 更新时间:2023-10-29 04:16:34 31 4
gpt4 key购买 nike

我们对代码进行了安全审核,他们提到我们的代码容易受到外部实体 (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/

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