Spec-Zone.ru › Python 3.10

Модули обработки XML

Исходный код: Lib/xml/

Интерфейсы Python для обработки XML сгруппированы в пакете xml.

Предупреждение

Модули XML не защищены от ошибочных или злонамеренно сконструированных данных. Если вам нужно разобрать недоверенные или неавторизованные данные, см. разделы Уязвимости XML и Пакет defusedxml.

Важно отметить, что модули в пакете xml требуют наличия по крайней мере одного SAX-совместимого парсера XML. Парсер Expat включён в Python, поэтому модуль xml.parsers.expat всегда будет доступен.

Документация для пакетов xml.dom и xml.sax — это определение Python-связей для интерфейсов DOM и SAX.

Подмодули обработки XML:

  • xml.etree.ElementTree: интерфейс ElementTree, простой и лёгкий процессор XML
  • xml.dom: определение интерфейса DOM
  • xml.dom.minidom: минимальная реализация DOM
  • xml.dom.pulldom: поддержка построения частичных деревьев DOM
  • xml.sax: базовые классы SAX2 и удобные функции
  • xml.parsers.expat: привязка парсера Expat

Уязвимости XML

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

В следующей таблице представлен обзор известных атак и уязвимость различных модулей к ним.

тип

sax

etree

minidom

pulldom

xmlrpc

миллиард смехов

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

квадратичный взрыв

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

Уязвим (1)

расширение внешних сущностей

Безопасно (5)

Безопасно (2)

Безопасно (3)

Безопасно (5)

Безопасно (4)

получение DTD

Безопасно (5)

Безопасно

Безопасно

Безопасно (5)

Безопасно

бомба для сжатия

Безопасно

Безопасно

Безопасно

Безопасно

Уязвим

  1. Expat 2.4.1 и более поздние версии не уязвимы для уязвимостей «миллиард смехов» и «квадратичный взрыв». Элементы все еще указаны как уязвимые из-за потенциальной зависимости от системных библиотек. Проверьте pyexpat.EXPAT_VERSION.
  2. xml.etree.ElementTree не расширяет внешние сущности и генерирует ParserError при появлении сущности.
  3. xml.dom.minidom не расширяет внешние сущности и просто возвращает нерасширенную сущность дословно.
  4. xmlrpclib не расширяет внешние сущности и опускает их.
  5. С Python 3.7.1 внешние общие сущности по умолчанию больше не обрабатываются.
миллиард смехов / экспоненциальное расширение сущностей

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

квадратичный взрыв расширения сущностей

Атака квадратичного взрыва похожа на атаку «миллиард смехов»; она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность с парой тысяч символов снова и снова. Атака не столь эффективна, как экспоненциальный случай, но она избегает срабатывания мер противодействия парсера, которые запрещают глубоко вложенные сущности.

расширение внешних сущностей

Объявления сущностей могут содержать больше, чем просто текст для замены. Они также могут указывать на внешние ресурсы или локальные файлы. Парсер XML обращается к ресурсу и встраивает содержимое в документ XML.

получение DTD

Некоторые XML-библиотеки, такие как Python xml.dom.pulldom, извлекают определения типов документов из удалённых или локальных расположений. Эта функция имеет аналогичные последствия, как проблема расширения внешних сущностей.

бомба для сжатия

Бомбы для сжатия (также известные как бомба ZIP) применяются ко всем XML-библиотекам, которые могут анализировать сжатые потоки XML, такие как сжатые gzip HTTP-потоки или файлы LZMA. Для злоумышленника это может уменьшить количество передаваемых данных в три и более раз.

Документация для defusedxml на PyPI содержит дополнительную информацию обо всех известных векторах атак с примерами и ссылками.

Пакет defusedxml

defusedxml — это чистый Python-пакет с изменёнными подклассами всех стандартных XML-парсеров, которые предотвращают любые потенциально злонамеренные операции. Использование этого пакета рекомендуется для любого серверного кода, который анализирует недоверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по другим эксплойтам XML, таким как XPath-инъекции.

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/xml.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API