Как избежать внедрения XML - PullRequest
6 голосов
/ 12 декабря 2008

У меня есть значение поля ввода, которое используется для формирования запроса XPath. Какие символы во входной строке я должен проверить, чтобы минимизировать возможность внедрения XML?

Ответы [ 6 ]

7 голосов
/ 12 декабря 2008

В этом документе подробно описывается концепция "слепого инъекции XPath".

В нем приводятся конкретные примеры инъекций XPath и обсуждаются способы их предотвращения.

В разделе " Защита от инъекций XPath " сказано:

" Защита от внедрения XPath по сути аналогична защите от SQL инъекции. Приложение должно дезинфицировать пользовательский ввод. В частности, одноместные и двухместные символы кавычек должны быть запрещены. Это можно сделать либо в приложении сам или в стороннем продукте (например, брандмауэр приложения.) Тестирование чувствительности приложения к XPath Injection может быть легко выполнено введение одинарной или двойной кавычки и проверка ответа. Если ошибка имеет произошло, тогда вероятно, что XPath-инъекция возможна . "

Как уже говорили другие, следует также обратить внимание на использование осей и // сокращение. Если используется XPath 2.0 , то функция doc () не должна быть разрешена, поскольку она предоставляет доступ к любому документ с известным URI (или именем файла).

Рекомендуется использовать API, который предварительно компилирует выражение XPath, но оставляет возможность его работы с динамически определенными параметрами или переменными. Тогда пользовательский ввод будет определять только содержимое этих параметров и никогда не будет рассматриваться как модификация уже скомпилированного выражения.

6 голосов
/ 13 декабря 2008

Переверните свою тактику вверх ногами.

Не пытайтесь отфильтровать недопустимые символы - политика «Предположим, что все нормально, если я не знаю, что это плохо»

Вместо этого отфильтруйте допустимые символы - политика «Это нормально, я предполагаю, что все остальное плохо» .

С точки зрения безопасности примите политику «Запретить по умолчанию» вместо «Принять по умолчанию» .

Например ...

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

Одним из способов было бы ограничиться A-Z, а затем убедиться, что ваша техника поиска распознает акцент (например, i = ì = í = î = ï и т. Д.), Хотя это относится к неевропейским именам.

... если вы запрашиваете номер, ограничитесь только цифрами и отклоните все остальное.

1 голос
/ 12 декабря 2008

Это зависит от того, что вы подразумеваете под «инъекцией XML». Есть ли какие-то части документа, которые являются конфиденциальными и которые пользователь не может видеть? Или вы открываете его как доступное для записи состояние и позволяете пользователю обновлять части документа, а им разрешается обновлять только определенные части?

На базовом уровне, чтобы ответить на ваш вопрос, вам нужно искать операции оси xpath (например, //, /, ::) и символы подстановки (@*, *) как минимум. Но я чувствую, что использование пользовательского ввода для прямой сборки xpath не может быть оптимальным решением. Может быть, если вы дадите нам больше контекста относительно того, чего вы пытаетесь достичь, мы могли бы предложить альтернативные подходы?

1 голос
/ 12 декабря 2008

Я бы начал с рассмотрения того, что является допустимым вводом для вашего конкретного варианта использования, а затем рассмотрим способы ограничения всего остального. Если у вас есть фиксированный диапазон значений ввода, я бы ограничил ввод только этими значениями. В противном случае, если ваш вариант использования требует, чтобы вы учитывали будущее, вам, возможно, захочется проверить модификаторы оси и разделители пути, такие как : и \.

0 голосов
/ 27 ноября 2009

Проверка входной строки будет полезна, возможно, с использованием чего-то вроде регулярного выражения (что-то вроде этого ^ \ w +), основываясь на том, что никакие специальные символы не допускаются.

0 голосов
/ 13 декабря 2008

Закрытие этой уязвимости - это просто исправление. Поэтому применение политики «Дефолт по умолчанию» сейчас слишком опасно. Я решил проверить ввод для следующих символов [, ", ', *, =, {, \,., Пробел. Я думаю, что это может предотвратить наиболее распространенные атаки Спасибо всем за ответы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...