Модули обработки XML
Исходный код: Lib/xml/
Интерфейсы Python для обработки XML сгруппированы в пакете xml.
Предупреждение
Модули XML не защищены от ошибочно сформированных или злонамеренно созданных данных. Если вам необходимо анализировать недоверенные данные или данные, подлинность которых не подтверждена, см. разделы Уязвимости XML и Пакет defusedxml.
Важно отметить, что модули пакета xml требуют наличия как минимум одного XML-анализатора, совместимого с SAX. Анализатор Expat входит в состав Python, поэтому модуль xml.parsers.expat будет доступен всегда.
Документация пакетов xml.dom и xml.sax описывает привязки Python для интерфейсов DOM и SAX.
Подмодули для работы с XML:
-
xml.etree.ElementTree: API ElementTree — простой и легковесный обработчик XML
-
xml.dom: определение API 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) | Безопасен |
бомба распаковки | Безопасен | Безопасен | Безопасен | Безопасен | Уязвим |
большие токены | Уязвим (6) | Уязвим (6) | Уязвим (6) | Уязвим (6) | Уязвим (6) |
- Expat 2.4.1 и более поздние версии не подвержены уязвимостям «миллиард смехов» и «квадратичное разрастание». Некоторые компоненты по-прежнему указаны как уязвимые из-за возможного использования библиотек, предоставляемых системой. См.
pyexpat.EXPAT_VERSION. -
xml.etree.ElementTreeне раскрывает внешние сущности и вызывает исключениеParseError, если встречается сущность. -
xml.dom.minidomне раскрывает внешние сущности и просто возвращает их без раскрытия. -
xmlrpc.clientне раскрывает внешние сущности и пропускает их. - Начиная с Python 3.7.1 внешние общие сущности по умолчанию больше не обрабатываются.
- Expat 2.6.0 и более поздние версии не подвержены атакам типа «отказ в обслуживании» из-за квадратичного времени выполнения при разборе больших токенов. Некоторые компоненты по-прежнему указаны как уязвимые из-за возможного использования библиотек, предоставляемых системой. См.
pyexpat.EXPAT_VERSION.
- «миллиард смехов» / экспоненциальное раскрытие сущностей
-
Атака «миллиард смехов», также известная как экспоненциальное раскрытие сущностей, использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение последней сущности содержит короткую строку. Экспоненциальное раскрытие приводит к появлению нескольких гигабайт текста и расходует много памяти и процессорного времени.
- квадратичное разрастание при раскрытии сущностей
-
Атака с квадратичным разрастанием похожа на атаку «миллиард смехов»; она также использует раскрытие сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность, содержащую пару тысяч символов. Эта атака не так эффективна, как экспоненциальный вариант, но позволяет обойти защитные меры анализатора, запрещающие глубокую вложенность сущностей.
- раскрытие внешних сущностей
-
Объявления сущностей могут содержать не только текст для подстановки. Они также могут указывать на внешние ресурсы или локальные файлы. XML-анализатор обращается к ресурсу и встраивает его содержимое в XML-документ.
- загрузка DTD
-
Некоторые библиотеки XML, например
xml.dom.pulldomиз Python, загружают определения типа документа из удаленных или локальных источников. Эта возможность имеет последствия, аналогичные проблеме раскрытия внешних сущностей. - бомба распаковки
-
Бомбы распаковки (также называемые ZIP-бомбами) представляют угрозу для всех библиотек XML, которые могут анализировать сжатые XML-потоки, например HTTP-потоки gzip или файлы, сжатые с помощью LZMA. Это позволяет злоумышленнику сократить объем передаваемых данных на три порядка и более.
- большие токены
-
Expat должен повторно анализировать незавершенные токены; без защиты, появившейся в Expat 2.6.0, это может привести к квадратичному времени выполнения, которое можно использовать для организации атаки типа «отказ в обслуживании» на приложение, анализирующее XML. Эта проблема известна как CVE-2023-52425.
В документации defusedxml на PyPI приведены дополнительные сведения обо всех известных векторах атак, примеры и ссылки.
Пакет defusedxml
defusedxml — это пакет на чистом Python с измененными подклассами всех XML-анализаторов из стандартной библиотеки, которые предотвращают любые потенциально вредоносные операции. Этот пакет рекомендуется использовать в серверном коде, обрабатывающем недоверенные XML-данные. В пакет также входят примеры эксплойтов и расширенная документация по другим способам эксплуатации XML, например внедрению XPath.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/xml.html