Spec-Zone .ru
спецификации, руководства, описания, API

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.7 и вперед. Можно обсудить их, задать вопросы о них, и получить справку от других пользователей с ними на Пользовательском Форуме 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)

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