2013-02-28 21 views
1

我有以下代碼以獲取舊網站中的一些翻譯(它也像這樣在有更重要的信息,其他一些功能。)防止在.NET XPath注入2.0

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

任何人都可以指導我如何解決這個問題?

+0

您可以使用正則表達式來驗證hLand.Value並丟棄看起來像XPATH的東西;請參閱「XPath注入預防」一章:http://www.ibm.com/developerworks/xml/library/x-xpathinjection/index.html – 2013-03-01 15:07:16

回答

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 
    } 
} 
+0

謝謝我會試試這個,對於這種情況我想它會工作,不確定對於其他情況,我會讓你知道的。 – 2013-03-01 13:20:50

+0

另一種選擇是通過創建一個輔助方法來採取主動的方法來阻止XPath注入,該方法將任何與XPath相關的標記從傳入的字符串中除去,然後在XPath中使用過濾的sting。 – EricL 2013-03-01 15:01:30

1

在防止XPath注入的主要思想是預編譯要使用,並允許XPath表達式變量(參數)的話,其在評估過程將由用戶輸入值代替。

在.NET

  1. XPathExpression.Compile()您的XPath expresion預編譯。

  2. 使用XPathExpression.SetContext()方法指定爲背景解析爲用戶輸入的值某些特定變量的XsltContext對象。

你可以閱讀更多有關如何評估包含變量here XPath表達式。

此文本包含很好和完整的例子。

+0

你能解釋我如何使用上下文來存檔我試圖做什麼?即時通訊還沒有能夠做到這一點,我實施了EricL提案的具體案件,但我不能爲我的大部分案件做。 – 2013-03-04 21:22:05

+0

@LuisTellez,你會評估這個字符串:''Translations/language [@ code = $ userInput]「'。您將在XsltContext對象中設置變量'$ userInput' - 以包含用戶的輸入。您將評估上面的字符串,使用您的XsltContext對象作爲評估此XPath表達式的上下文。所有這些在這裏都有很好的解釋:http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltcontext.aspx – 2013-03-04 21:51:13

+0

沒有任何文檔或示例可以告訴我這是可能的,他們解析上下文但不能評估變量並按變量進行過濾 – 2013-03-06 12:51:36