1

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

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只是库的一部分,我不能使用它。

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

4

2 回答 2

1

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

在 .NET 中

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

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

您可以在此处阅读有关如何计算包含变量的 XPath 表达式的更多信息。

这篇文章包含了很好和完整的例子。

于 2013-03-02T00:47:15.010 回答
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
   }
}
于 2013-03-01T04:31:27.830 回答