Spec-Zone.ru › Python 3.7

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

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

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

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

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

Важно отметить, что модули в пакете 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

«миллиард хохотов»

Уязвим

Уязвим

Уязвим

Уязвим

Уязвим

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

Уязвим

Уязвим

Уязвим

Уязвим

Уязвим

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

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

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

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

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

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

Получение DTD

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

Безопасно

Безопасно

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

Безопасно

Бомба сжатия

Безопасно

Безопасно

Безопасно

Безопасно

Уязвим

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

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

Квадратичное расширение сущностей

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

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

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

Получение DTD

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

Бомба сжатия

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

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

Пакеты defusedxml и defusedexpat

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

defusedexpat предоставляет изменённый libexpat и исправленный модуль pyexpat, которые имеют меры предосторожности против атак DoS с расширением сущностей. Модуль defusedexpat по-прежнему позволяет разумное и настраиваемое количество расширений сущностей. Изменения могут быть включены в будущих версиях Python, но не будут включены в какие-либо исправления Python, потому что они нарушают обратную совместимость.

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

Spec-Zone.ru

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