xml.md
1> **Источник:** https://python-all.ru/3.4/library/xml.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.4. Модули обработки XML89Интерфейсы Python для обработки XML объединены в пакете `xml`.1011> **Предупреждение**12>13> Модули XML не защищены от ошибочных или вредоносных данных. Если необходимо обрабатывать непроверенные или неаутентифицированные данные, обратитесь к разделам [*Уязвимости XML*](https://python-all.ru/3.4/library/xml.html#xml-vulnerabilities) и [*Пакеты defusedxml и defusedexpat*](https://python-all.ru/3.4/library/xml.html#defused-packages).1415Важно отметить, что модули из пакета [`xml`](https://python-all.ru/3.4/library/xml.html#module-xml) требуют наличия как минимум одного SAX-совместимого парсера XML. Парсер Expat входит в состав Python, поэтому модуль [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) всегда будет доступен.1617Документация пакетов [`xml.dom`](https://python-all.ru/3.4/library/xml.dom.html#module-xml.dom) и [`xml.sax`](https://python-all.ru/3.4/library/xml.sax.html#module-xml.sax) является определением привязок Python для интерфейсов DOM и SAX.1819Подмодули для работы с XML:2021- [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree): API ElementTree, простой и лёгкий процессор XML.2223- [`xml.dom`](https://python-all.ru/3.4/library/xml.dom.html#module-xml.dom): определение API DOM.24- [`xml.dom.minidom`](https://python-all.ru/3.4/library/xml.dom.minidom.html#module-xml.dom.minidom): минимальная реализация DOM.25- [`xml.dom.pulldom`](https://python-all.ru/3.4/library/xml.dom.pulldom.html#module-xml.dom.pulldom): поддержка построения частичных деревьев DOM.2627- [`xml.sax`](https://python-all.ru/3.4/library/xml.sax.html#module-xml.sax): базовые классы и вспомогательные функции SAX2.28- [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat): привязка парсера Expat.2930## 20.4.1. Уязвимости XML3132Модули обработки XML не защищены от злонамеренно сконструированных данных. Злоумышленник может использовать возможности XML для проведения атак типа «отказ в обслуживании», доступа к локальным файлам, установления сетевых соединений с другими машинами или обхода межсетевых экранов.3334В следующей таблице представлен обзор известных атак и уязвимости различных модулей к ним.3536| Тип | sax | etree | minidom | pulldom | xmlrpc |37| --- | --- | --- | --- | --- | --- |38| Миллиард смешков | **Да** | **Да** | **Да** | **Да** | **Да** |39| Квадратичное разрастание | **Да** | **Да** | **Да** | **Да** | **Да** |40| раскрытие внешних сущностей | **Да** | Нет (1) | Нет (2) | **Да** | Нет (3) |41| Получение DTD | **Да** | Нет | Нет | **Да** | Нет |42| бомба декомпрессии | Нет | Нет | Нет | Нет | **Да** |43441. [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не разворачивает внешние сущности и вызывает `ParserError` при появлении сущности.452. [`xml.dom.minidom`](https://python-all.ru/3.4/library/xml.dom.minidom.html#module-xml.dom.minidom) не разворачивает внешние сущности и просто возвращает неразвёрнутую сущность дословно.463. `xmlrpclib` не разворачивает внешние сущности и опускает их.4748**миллиард смешков / экспоненциальное расширение сущностей**4950Атака5152[Billion Laughs](https://python-all.ru/3.4/library/xml.html)5354(миллиард смешков) – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение конечной сущности содержит небольшую строку. Экспоненциальное расширение приводит к получению нескольких гигабайт текста и потребляет много памяти и процессорного времени.5556**квадратичное расширение сущностей**5758Атака квадратичного раздувания похожа на атаку5960[Миллиард смешков](https://python-all.ru/3.4/library/xml.html)6162; она тоже злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность длиной в пару тысяч символов снова и снова. Атака не так эффективна, как экспоненциальный случай, но она избегает срабатывания защитных механизмов парсера, которые запрещают глубоко вложенные сущности.6364**раскрытие внешних сущностей**6566Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы или локальные файлы. XML-парсер обращается к ресурсу и встраивает содержимое в XML-документ.6768**Получение DTD**6970Некоторые библиотеки XML, такие как7172[`xml.dom.pulldom`](https://python-all.ru/3.4/library/xml.dom.pulldom.html#module-xml.dom.pulldom)7374в Python, извлекают определения типа документа из удалённых или локальных источников. Эта возможность имеет схожие последствия с проблемой разворачивания внешних сущностей.7576**бомба декомпрессии**7778Бомбы декомпрессии (также известные как7980[ZIP bomb](https://python-all.ru/3.4/library/xml.html)8182) применимы ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как gzipped HTTP-потоки или файлы, сжатые LZMA. Для злоумышленника это может уменьшить объем передаваемых данных на три порядка и более.8384Документация [defusedxml](https://python-all.ru/3.4/library/xml.html) на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.8586## 20.4.2. Пакеты `defusedxml` и `defusedexpat`8788[defusedxml](https://python-all.ru/3.4/library/xml.html) – это чистый пакет Python с модифицированными подклассами всех XML-парсеров стандартной библиотеки, которые предотвращают любые потенциально вредоносные операции. Использование этого пакета рекомендуется для любого серверного кода, который разбирает непроверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по дополнительным XML-эксплойтам, таким как XPath-инъекция.8990[defusedexpat](https://python-all.ru/3.4/library/xml.html) предоставляет модифицированный libexpat и пропатченный модуль `pyexpat`, которые содержат контрмеры против DoS-атак с разворачиванием сущностей. Модуль `defusedexpat` по-прежнему допускает разумное и настраиваемое количество разворачиваний сущностей. Изменения могут быть включены в один из будущих релизов Python, но не будут включены ни в один из исправляющих ошибки релизов Python, поскольку они нарушают обратную совместимость.91