Как избежать внедрения XML

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
11 007
6

Ответы 6

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

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

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

Этот документ подробно описывает концепцию «слепого внедрения XPath».

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

В разделе «Защита от внедрения XPath» сказано:

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

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

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

Мне кажется, что, как и в случае с SQL-инъекцией, использование переменных XPath в значительной степени предотвращает инъекцию.

kdgregory 13.12.2008 16:55

Не могли бы вы привести пример того, как предоставить «динамически определенные переменные» в выражении XPath? В частности, как это сделать в .NET? Я видел это только с конкатенацией строк.

frankadelic 17.06.2011 08:28

@frankadelic: msdn.microsoft.com/en-us/library/…

Dimitre Novatchev 17.06.2011 10:06

Спасибо - я считаю, что этот пример применим к преобразованию XSLT. Можно ли то же самое сделать для простых выражений XPATH, таких как SelectSingleNode ()?

frankadelic 18.06.2011 04:02

@frankadelic: IXSLTContext используется для установки контекста для оценки выражения XPath, имя вводит в заблуждение.

Dimitre Novatchev 18.06.2011 06:00

@frankadelic: конкретные примеры см. здесь: codeproject.com/KB/cs/CustomFunctions.aspx

Dimitre Novatchev 18.06.2011 06:08

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

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

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

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

Например ...

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

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

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

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

Ах, вроде исправления, о котором вы (или ваш преемник) горько пожалеете позже ... en.wikipedia.org/wiki/Technical_debt

bortzmeyer 15.12.2008 12:13

Важными символами для экранирования или кодирования их в сущности html являются <и> и то, что система использует для экранирования, / \, union | , или прекратить; ,. и инкапсулировать "'[{}]` Существует много проблем с безопасностью с xml, и даже если фреймворк его не использует, его можно использовать для взлома подсистемы хранения. Это один из немногих языков, которые необходимо не используется на веб-серверах. Google и Facebook имеют уязвимости XML. Атака внешних объектов и атаки xpath. Вот уязвимость, вызванная модулем php-xml: youtube.com/watch?v=G1JUQrqK4IE

drtechno 18.09.2019 17:49

XML-RPC - это обычная область для атак, направленных на ваш веб-сайт Wordpress: youtube.com/watch?v=xz2wo9Wwkog

drtechno 18.09.2019 17:50

другие вещи, такие как добавление запроса в конце или URL-адреса типа //website.com/page.php?id=1 на //website.com/page.php?id=1 UNION 1, 2, 3, 4, 5 может привести к тому, что синтаксический анализатор будет запрашивать базу данных в виде дерева, что приведет к раскрытию личной информации, такой как учетные записи входа. И есть несколько плагинов CMS, которые непреднамеренно вызывают этот эффект.

drtechno 18.09.2019 17:57

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

Другие вопросы по теме