2013-02-28 4 views
1

У меня есть следующий код, чтобы получить некоторые переводы для старого сайта (также, как это его в некоторых других функциональных возможностей, которые имеют более важную информацию.)Предотвращение Xpath Injection на .net 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 injection Attacks.

Я пытаюсь применить то же самое я делаю с инъекцией SQL, который является использование параметров, но не нашел, как это сделать в 2.0

Я попробовал этот учебник: http://weblogs.asp.net/cazzu/archive/2003/10/07/30888.aspx

Но DynamicContext является частью библиотеки, и я не могу ее использовать.

Может ли кто-нибудь вести меня о том, как я могу это исправить?

+0

Вы можете использовать Regex для проверки hLand.Value и отказаться от того, что выглядит как XPATH; см. главу «Предотвращение инъекций XPath» здесь: http://www.ibm.com/developerworks/xml/library/x-xpathinjection/index.html –

ответ

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

Спасибо, я попробую это, для этого случая я думаю, что это сработает, а не уверен для других случаев, я дам вам знать. –

+0

Еще один вариант - использовать проактивный подход к внедрению XPath, создав вспомогательный метод, который удаляет любую разметку, связанную с XPath, из входящей строки, а затем используя отфильтрованное жало в вашем XPath. – EricL

1

Основная идея в предотвращении инъекции XPath является предварительной компиляции выражение XPath вы хотите использовать, и чтобы переменные (параметры) в нем, которые во время процесс оценки будет заменен введенными пользователем значениями.

В .NET:

  1. Попросите XPath expresion скомпилированных с XPathExpression.Compile().

  2. Использование XPathExpression.SetContext() Метод указать в качестве контекста объекта XsltContext, устраняющее некоторые специфические переменные для введенных пользователем значений.

Вы можете прочитать больше о том, как оценивать выражение XPath, которое содержит переменные here.

Этот текст содержит хорошие и полные примеры.

+0

Можете ли вы объяснить мне, как я могу использовать контекст для архивирования того, что я пытаюсь сделать?im havent смог это сделать, я внедрил предложение EricL для конкретного случая, но я не могу сделать это для большинства моих дел. –

+0

@LuisTellez, вы оцените эту строку: '' Переводы/язык [@ code = $ userInput] "'. Вы установите переменную '$ userInput' в свой объект XsltContext, чтобы содержать вход пользователя. Вы оцените эту строку, используя объект XsltContext в качестве контекста для оценки этого выражения XPath. Все это хорошо объяснено здесь: http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltcontext.aspx –

+0

Нет документации, которая или примеры arround, которые показывают мне, что это возможно, они разрешают контекст, но не могут оценивать переменные и фильтровать их –

Смежные вопросы