12.11. XML Функции

Таблица 12.15. XML Функции

Имя Описание
ExtractValue() Извлекает значение из строки XML, используя нотацию XPath
UpdateXML() Возвратите замененный фрагмент XML

Этот раздел обсуждает XML и связанную функциональность в MySQL.

Отметить

Возможно получить отформатированный XML вывод из MySQL в mysql и mysqldump клиентах, вызывая их с --xml опция. См. Раздел 4.5.1, "mysql — MySQL Command-Line Tool", и Раздел 4.5.4, "mysqldump — Программа Резервного копирования базы данных".

Две функции, обеспечивающие основной XPath 1.0 (Язык Пути XML, версия 1.0) возможности, доступны. Некоторая основная информация о синтаксисе XPath и использовании обеспечивается позже в этом разделе; однако, всестороннее обсуждение этих тем выходит за рамки этого Руководства, и следует отослать к Языку Пути XML (XPath) 1.0 стандарта для категорической информации. Полезный ресурс для плохо знакомых с XPath или кто требует переболее нового в основах, Zvon.org Учебное руководство XPath, которое доступно на нескольких языках.

Отметить

Эти функции остаются разрабатываемыми. Мы продолжаем улучшать эти и другие аспекты XML и функциональности XPath в MySQL 5.6 и вперед. Можно обсудить их, задать вопросы о них, и получить справку от других пользователей с ними на Пользовательском Форуме XML MySQL.

Выражения XPath, используемые с этими функциями, поддерживают пользовательские переменные и локальные сохраненные переменные программы. Пользовательские переменные слабо проверяются; переменные, локальные для сохраненных программ, строго проверяются (см. также Ошибку #26518):

Выражения, содержащие пользовательские переменные или переменные, локальные для сохраненных программ, должны иначе (за исключением нотации), соответствуют правилам для выражений XPath, содержащих переменные как дано в XPath 1.0 спецификации.

Отметить

В настоящий момент пользовательская переменная, используемая, чтобы сохранить выражение XPath, обрабатывается как пустая строка. Из-за этого не возможно сохранить выражение XPath как пользовательскую переменную. (Ошибка #32911)

Отметить

Обсуждение подробно синтаксиса XPath и использования выходит за рамки этого Руководства. Пожалуйста, см. Язык Пути XML (XPath) 1.0 спецификации для категорической информации. Полезный ресурс для плохо знакомых с XPath или кто желает переболее новое в основах, Zvon.org Учебное руководство XPath, которое доступно на нескольких языках.

Описания и примеры некоторых основных выражений XPath следуют:

Ограничения XPath. Синтаксис XPath, поддерживаемый этими функциями, в настоящий момент подвергается следующим ограничениям:

Выражения XPath, которые передают как параметры ExtractValue() и UpdateXML() может содержать символ двоеточия (":") в селекторах элемента, который включает их использованию с разметкой, использующей нотацию пространств имен XML. Например:

mysql> SET @xml = '<a>111<b:c>222<d>333</d><e:f>444</e:f></b:c></a>';Query OK, 0 rows affected (0.00 sec)mysql> SELECT ExtractValue(@xml, '//e:f');+-----------------------------+| ExtractValue(@xml, '//e:f') |+-----------------------------+| 444                         |+-----------------------------+1 row in set (0.00 sec)mysql> SELECT UpdateXML(@xml, '//b:c', '<g:h>555</g:h>');+--------------------------------------------+| UpdateXML(@xml, '//b:c', '<g:h>555</g:h>') |+--------------------------------------------+| <a>111<g:h>555</g:h></a>                   |+--------------------------------------------+1 row in set (0.00 sec)

Это подобно в некотором отношении тому, что разрешается Apache Xalan и некоторые другие синтаксические анализаторы, и намного более просто чем требование объявлений пространства имен или использования namespace-uri() и local-name() функции.

Обработка ошибок. Для обоих ExtractValue() и UpdateXML(), используемый локатор XPath должен быть допустимым, и XML, который будет искаться, должен состоять из элементов, которые должным образом вкладываются и закрываются. Если локатор недопустим, ошибка сгенерирована:

mysql> SELECT ExtractValue('<a>c</a><b/>',
        '/&a');ERROR 1105 (HY000): XPATH syntax error: '&a'

Если xml_frag не состоит из элементов, которые должным образом вкладываются и закрываются, NULL возвращается и предупреждение сгенерировано, как показано в этом примере:

mysql> SELECT ExtractValue('<a>c</a><b',
        '//a');+-----------------------------------+| ExtractValue('<a>c</a><b', '//a') |+-----------------------------------+| NULL                              |+-----------------------------------+1 row in set, 1 warning (0.00 sec)mysql> SHOW WARNINGS;+---------+------+-------------------------------------------------------------------------------------------+| Level   | Code | Message                                                                                   |+---------+------+-------------------------------------------------------------------------------------------+| Warning | 1523 | Incorrect XML value: 'parse error at line 1 pos 11: END-OF-INPUT unexpected ('>' wanted)' |+---------+------+-------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> SELECT ExtractValue('<a>c</a><b/>', '//a');+-------------------------------------+| ExtractValue('<a>c</a><b/>', '//a') |+-------------------------------------+| c                                   |+-------------------------------------+1 row in set (0.00 sec)
Важный

Заменяющий XML, используемый в качестве третьего параметра UpdateXML() не проверяется, чтобы определить, состоит ли это исключительно из элементов, которые должным образом вкладываются и закрываются.

Инжекция XPath. инжекция кода происходит, когда вредоносный код вводится в систему, чтобы получить несанкционированный доступ к полномочиям и данным. Это основано на использовании предположений, сделанных разработчиками о типе и контенте ввода данных от пользователей. XPath не является никаким исключением в этом отношении.

Общий сценарий, в котором это может произойти, имеет место приложения, которое обрабатывает авторизацию, соответствуя комбинацию имени для входа в систему и пароля с найденными в XML-файле, используя выражение XPath как этот:

//user[login/text()='neapolitan' and password/text()='1c3cr34m']/attribute::id

Это - XPath, эквивалентный из SQL-оператора как этот:

SELECT id FROM users WHERE login='neapolitan' AND password='1c3cr34m';

Приложение PHP, использующее XPath, могло бы обработать процесс входа в систему как это:

<?php  $file     =   "users.xml";  $login    =   $POST["login"];  $password =   $POST["password"];  $xpath = "//user[login/text()=$login and password/text()=$password]/attribute::id";  if( file_exists($file) )  {    $xml = simplexml_load_file($file);    if($result = $xml->xpath($xpath))      echo "You are now logged in as user $result[0].";    else      echo "Invalid login name or password.";  }  else    exit("Failed to open $file.");?>

Никакие проверки не выполняются на вводе. Это означает, что злорадный пользователь может "закоротить" тест, входя ' or 1=1 и для имени для входа в систему и для пароля, приводящего к $xpath быть оцененным как показано здесь:

//user[login/text()='' or 1=1 and password/text()='' or 1=1]/attribute::id

Так как выражение в квадратных скобках всегда оценивает как true, это - эффективно то же самое как этот, который соответствует id атрибут каждого user элемент в XML-документе:

//user/attribute::id

Один путь, которым может обойтись эта определенная атака, просто, заключая имена переменной в кавычки, которые будут интерполированы в определении $xpath, принуждение значений, которые передают из Веб-формы, которая будет преобразована в строки:

$xpath = "//user[login/text()='$login' and password/text()='$password']/attribute::id";

Это - та же самая стратегия, которая часто рекомендуется для того, чтобы предотвратить атаки с использованием кода на SQL. Вообще, методы, за которыми следует следовать для того, чтобы предотвратить атаки инжекции XPath, являются тем же самым что касается предотвращения инжекции SQL:

Так же, как атаки с использованием кода на SQL могут использоваться, чтобы получить информацию о схемах базы данных, так можете, инжекция XPath использоваться, чтобы пересечь XML-файлы, чтобы раскрыть их структуру, как обсуждено в статье Амита Кляйна Ослепляют Инжекцию XPath (файл PDF, 46 Кбит).

Также важно проверить вывод, отсылаемый назад к клиенту. Рассмотрите то, что может произойти, когда мы используем MySQL ExtractValue() функция:

mysql> SELECT ExtractValue(    ->     LOAD_FILE('users.xml'),    ->     '//user[login/text()="" or 1=1 and password/text()="" or
        1=1]/attribute::id'    -> ) AS id;+-------------------------------+| id                            |+-------------------------------+| 00327 13579 02403 42354 28570 |+-------------------------------+1 row in set (0.01 sec)

Поскольку ExtractValue() возвраты многократные соответствия как разграниченная одинарным интервалом строка, эта инжекционная атака обеспечивает каждый допустимый ID, содержавший в пределах users.xml пользователю как единственная строка вывода. Как дополнительная гарантия, следует также протестировать вывод прежде, чем возвратить это пользователю. Вот простой пример:

mysql> SELECT @id = ExtractValue(    ->     LOAD_FILE('users.xml'),    ->     '//user[login/text()="" or 1=1 and password/text()="" or
        1=1]/attribute::id'    -> );Query OK, 0 rows affected (0.00 sec)mysql> SELECT IF(    ->     INSTR(@id, '
        ') = 0,    ->     @id,    ->     'Unable to retrieve user ID')    -> AS singleID;+----------------------------+| singleID                   |+----------------------------+| Unable to retrieve user ID |+----------------------------+1 row in set (0.00 sec)

Вообще, направляющие линии для того, чтобы возвратить данные пользователям надежно являются тем же самым что касается принятия ввода данных пользователем. Им можно подвести итог как:




Spec-Zone.ru - all specs in one place