【问题标题】:Preventing Xpath Injection on .net 2.0防止 .net 2.0 上的 Xpath 注入
【发布时间】:2013-02-28 20:30:28
【问题描述】:

我有以下代码来获取旧网站的一些翻译(在其他一些具有更重要信息的功能中也是如此。)

Dim myDoc As New XmlDocument
myDoc.Load(Server.MapPath("\GlobalContent\TranslationXML\TranslationXML.xml"))
Dim translationText As XmlNodeList = myDoc.SelectNodes("Transaltions/language[@code='" + hLang.Value + "']")

Hlang 来自用户输入,如您所见,这很容易受到 Xpath 注入攻击。

我正在尝试应用与 SQL 注入相同的方法,即使用参数,但在 2.0 中还没有找到方法

我已经尝试过这个教程:http://weblogs.asp.net/cazzu/archive/2003/10/07/30888.aspx

但是 DynamicContext 只是库的一部分,我不能使用它。

谁能指导我如何解决这个问题?

【问题讨论】:

标签: .net xml xpath .net-2.0


【解决方案1】:

不幸的是,XmlDocument 和 XPathDocument 都没有提供一种用替换编译 XPath 的好方法(类似于已编译的 SQL 查询)。因此,我推荐一种稍微详细但安全的方法 - 使用主 XPath 获取 XmlNodeList,并遍历每个节点并检查属性,直到找到一个或多个匹配项:

示例 C# 代码(我会写 VB,但我很生疏):

XmlNodeList nodes = myDoc.SelectNodes("Transaltions/language");
foreach (XmlNode node in nodes) {
   XmlElement elem = (XmlElement)node;
   if (elem.GetAttribute("code") == hLang.Value) {
      //elem is your match
   }
}

【讨论】:

  • 谢谢,我会试试这个,对于这种情况我想它会起作用,不确定其他情况,我会告诉你的。
  • 另一种选择是通过创建一个辅助方法从传入的字符串中去除任何与 XPath 相关的标记,然后在您的 XPath 中使用过滤后的字符串,从而对 XPath 注入采取主动方法。
【解决方案2】:

防止 XPath 注入的主要思想是预编译您要使用的 XPath 表达式并允许其中的变量(参数),在评估过程中这些变量将被用户输入的值替换。

在 .NET 中

  1. 使用 XPathExpression.Compile() 预编译您的 XPath 表达式。

  2. 使用 XPathExpression.SetContext() 方法XsltContext 对象指定为上下文,该对象将某些特定变量解析为用户输入的值。

您可以阅读有关如何评估包含变量 here 的 XPath 表达式的更多信息。

本文包含了很好的完整示例。

【讨论】:

  • 你能解释一下我如何使用上下文来归档我想要做的事情吗?我做不到,我针对特定案例实施了 EricL 提案,但我的大多数案例都做不到。
  • @LuisTellez,您将评估此字符串:"Translations/language[@code=$userInput]"。您将在 XsltContext 对象中设置变量 $userInput 以包含用户的输入。您将使用您的 XsltContext 对象作为评估此 XPath 表达式的上下文来评估上述字符串。所有这些都在这里得到了很好的解释:msdn.microsoft.com/en-us/library/…
  • 没有任何文档或示例表明这是可能的,它们解析上下文但无法评估变量并按它们过滤
  • @LuisTellez,您重写了ResolveVariable() 方法,以便根据变量名称,此方法返回相应的用户输入的字符串。然后将此 XsltContext 作为参数传递给 Evaluate() 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多