Как предотвратить инъекцию XPath / XML in.NET

Как предотвратить инъекцию XPATH в .NET Framework?

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

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

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

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

4 ответов


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

в .NET:

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

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

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

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


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


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


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

предоставьте пользователю пару опций для выбора, а затем создайте запрос.

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