Spec-Zone.ru › Python 3.6

Модули обработки 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

20.4.1. Уязвимости 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.8.0, внешние общие сущности по умолчанию больше не обрабатываются Python.
«миллиард смеющихся» / экспоненциальное расширение сущностей

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

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

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

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

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

получение DTD

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

бомба декомпрессии

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

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

20.4.2. Пакеты defusedxml и defusedexpat

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

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

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

Spec-Zone.ru

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