> **Источник:** https://python-all.ru/3.2/library/xml.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

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

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

> **Предупреждение**
>
> Модули XML не защищены от ошибочных или вредоносных данных. Если нужно обрабатывать непроверенные или неаутентифицированные данные, см. [*уязвимости XML*](https://python-all.ru/3.2/library/xml.html#xml-vulnerabilities).

Важно отметить, что модули из пакета [`xml`](https://python-all.ru/3.2/library/xml.html#module-xml) требуют наличия как минимум одного SAX-совместимого парсера XML. Парсер Expat входит в состав Python, поэтому модуль [`xml.parsers.expat`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat) всегда будет доступен.

Документация пакетов [`xml.dom`](https://python-all.ru/3.2/library/xml.dom.html#module-xml.dom) и [`xml.sax`](https://python-all.ru/3.2/library/xml.sax.html#module-xml.sax) является определением привязок Python для интерфейсов DOM и SAX.

Подмодули для работы с XML:

- [`xml.etree.ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree): API ElementTree, простой и лёгкий

- [`xml.dom`](https://python-all.ru/3.2/library/xml.dom.html#module-xml.dom): определение API DOM.
- [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom): лёгкая реализация DOM
- [`xml.dom.pulldom`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#module-xml.dom.pulldom): поддержка построения частичных деревьев DOM.

- [`xml.sax`](https://python-all.ru/3.2/library/xml.sax.html#module-xml.sax): базовые классы и вспомогательные функции SAX2.
- [`xml.parsers.expat`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat): привязка парсера Expat.

# 19.5. Уязвимости XML

Модули обработки XML не защищены от вредоносных данных. Злоумышленник может использовать уязвимости, например, для атак типа «отказ в обслуживании», доступа к локальным файлам, создания сетевых соединений с другими машинами или обхода межсетевых экранов. Атаки на XML используют малоизвестные возможности, такие как встроенная [DTD](https://python-all.ru/3.2/library/xml.html) (определение типа документа) с сущностями.

| Тип | sax | etree | minidom | pulldom | xmlrpc |
| --- | --- | --- | --- | --- | --- |
| Миллиард смешков | **True** | **True** | **True** | **True** | **True** |
| Квадратичное разрастание | **True** | **True** | **True** | **True** | **True** |
| раскрытие внешних сущностей | **True** | False (1) | False (2) | **True** | False (3) |
| Получение DTD | **True** | False | False | **True** | False |
| бомба декомпрессии | False | False | False | False | **True** |

1. [`xml.etree.ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не раскрывает внешние сущности и вызывает ParserError при появлении сущности.
2. [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) не разворачивает внешние сущности и просто возвращает неразвёрнутую сущность дословно.
3. `xmlrpclib` не разворачивает внешние сущности и опускает их.

**миллиард смешков / экспоненциальное расширение сущностей**

Атака

[Billion Laughs](https://python-all.ru/3.2/library/xml.html)

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

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

Квадратичная атака похожа на атаку

[Billion Laughs](https://python-all.ru/3.2/library/xml.html)

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

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

Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы через публичные или системные идентификаторы. Системные идентификаторы – это стандартные URI или ссылки на локальные файлы. XML-парсер получает ресурс, например, с помощью HTTP- или FTP-запросов, и встраивает содержимое в XML-документ.

**Получение DTD**

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

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

Проблема бомб декомпрессии (также известных как

[ZIP bomb](https://python-all.ru/3.2/library/xml.html)

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

Документация пакета [defusedxml](https://python-all.ru/3.2/library/xml.html) на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.

## 19.5.1. defused packages

[defusedxml](https://python-all.ru/3.2/library/xml.html) – это чистый Python-пакет с модифицированными подклассами всех XML-парсеров из стандартной библиотеки, которые предотвращают любые потенциально опасные операции. Эти меры рекомендуются для любого серверного кода, который обрабатывает ненадёжные XML-данные. Пакет также содержит примеры эксплойтов и расширенную документацию по другим XML-эксплойтам, таким как XPath-инъекция.

[defusedexpat](https://python-all.ru/3.2/library/xml.html) предоставляет модифицированную libexpat и исправленную замену модуля расширения `pyexpat` с контрмерами против DoS-атак путём расширения сущностей. Defusedexpat по-прежнему допускает разумное и настраиваемое количество расширений сущностей. Эти модификации будут включены в будущие выпуски Python.

Обходные пути и модификации не включены в патч-релизы, так как они нарушают обратную совместимость. В конечном счёте, встроенные DTD и расширение сущностей – это чётко определённые возможности XML.
