Как предотвратить внедрение XPath / XML в .NET - PullRequest
6 голосов
/ 17 июня 2011

Как я могу предотвратить внедрение XPATH в .NET Framework?

Ранее мы использовали конкатенацию строк для построения операторов XPATH, но обнаружили, что конечные пользователи могут выполнять произвольный XPATH.Например:

string queryValue = "pages[@url='" + USER_INPUT_VALUE + "']";
node = doc.DocumentElement.SelectSingleNode(queryValue);

Было бы достаточно вырезать одинарные и двойные кавычки из входных строк?

Или .NET Framework поддерживает параметризованные запросы XPATH?

Ответы [ 4 ]

8 голосов
/ 18 июня 2011

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

В .NET :

  1. Предварительно скомпилируйте выражение XPath с XPathExpression.Compile ().

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

Подробнее о том, как оценить выражение XPath, содержащее переменные здесь .

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

2 голосов
/ 17 июня 2011

Строго набранные параметры доступны, если вы используете полномасштабный XsltTransform .

1 голос
/ 17 июня 2011

Параметризованный XPath возможен, если вы используете Saxon в качестве процессора XPath.

0 голосов
/ 17 июня 2011

Вместо строго типизированных параметров вы можете уменьшить параметры для пользователя. Зачем давать им полный контроль, если вы этого не хотите?

Предоставьте пользователю несколько вариантов выбора, а затем создайте запрос.

Разрешение пользователю вводить любую строку вызывает проблемы или большую работу.

...