xml.md
1> **Источник:** https://python-all.ru/3.2/library/xml.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.4. Модули обработки XML89Интерфейсы Python для обработки XML объединены в пакете `xml`.1011> **Предупреждение**12>13> Модули XML не защищены от ошибочных или вредоносных данных. Если нужно обрабатывать непроверенные или неаутентифицированные данные, см. [*уязвимости XML*](https://python-all.ru/3.2/library/xml.html#xml-vulnerabilities).1415Важно отметить, что модули из пакета [`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) всегда будет доступен.1617Документация пакетов [`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.1819Подмодули для работы с XML:2021- [`xml.etree.ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree): API ElementTree, простой и лёгкий2223- [`xml.dom`](https://python-all.ru/3.2/library/xml.dom.html#module-xml.dom): определение API DOM.24- [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom): лёгкая реализация DOM25- [`xml.dom.pulldom`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#module-xml.dom.pulldom): поддержка построения частичных деревьев DOM.2627- [`xml.sax`](https://python-all.ru/3.2/library/xml.sax.html#module-xml.sax): базовые классы и вспомогательные функции SAX2.28- [`xml.parsers.expat`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat): привязка парсера Expat.2930# 19.5. Уязвимости XML3132Модули обработки XML не защищены от вредоносных данных. Злоумышленник может использовать уязвимости, например, для атак типа «отказ в обслуживании», доступа к локальным файлам, создания сетевых соединений с другими машинами или обхода межсетевых экранов. Атаки на XML используют малоизвестные возможности, такие как встроенная [DTD](https://python-all.ru/3.2/library/xml.html) (определение типа документа) с сущностями.3334| Тип | sax | etree | minidom | pulldom | xmlrpc |35| --- | --- | --- | --- | --- | --- |36| Миллиард смешков | **True** | **True** | **True** | **True** | **True** |37| Квадратичное разрастание | **True** | **True** | **True** | **True** | **True** |38| раскрытие внешних сущностей | **True** | False (1) | False (2) | **True** | False (3) |39| Получение DTD | **True** | False | False | **True** | False |40| бомба декомпрессии | False | False | False | False | **True** |41421. [`xml.etree.ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не раскрывает внешние сущности и вызывает ParserError при появлении сущности.432. [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) не разворачивает внешние сущности и просто возвращает неразвёрнутую сущность дословно.443. `xmlrpclib` не разворачивает внешние сущности и опускает их.4546**миллиард смешков / экспоненциальное расширение сущностей**4748Атака4950[Billion Laughs](https://python-all.ru/3.2/library/xml.html)5152– также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, конечное определение сущности содержит небольшую строку. В итоге эта небольшая строка разворачивается до нескольких гигабайт. Экспоненциальное расширение также потребляет много процессорного времени.5354**квадратичное расширение сущностей**5556Квадратичная атака похожа на атаку5758[Billion Laughs](https://python-all.ru/3.2/library/xml.html)5960; она тоже злоупотребляет расширением сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность размером в несколько тысяч символов. Атака не так эффективна, как экспоненциальный случай, но она избегает срабатывания контрмер парсеров против сильно вложенных сущностей.6162**раскрытие внешних сущностей**6364Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы через публичные или системные идентификаторы. Системные идентификаторы – это стандартные URI или ссылки на локальные файлы. XML-парсер получает ресурс, например, с помощью HTTP- или FTP-запросов, и встраивает содержимое в XML-документ.6566**Получение DTD**6768Некоторые XML-библиотеки, такие как mod:'xml.dom.pulldom' из Python, извлекают определения типа документа из удалённых или локальных источников. Эта возможность имеет схожие последствия с проблемой расширения внешних сущностей.6970**бомба декомпрессии**7172Проблема бомб декомпрессии (также известных как7374[ZIP bomb](https://python-all.ru/3.2/library/xml.html)7576) применима ко всем XML-библиотекам, которые могут обрабатывать сжатые XML-потоки, такие как потоки HTTP, сжатые gzip, или файлы, сжатые LZMA. Для атакующего это может уменьшить объём передаваемых данных на три порядка и более.7778Документация пакета [defusedxml](https://python-all.ru/3.2/library/xml.html) на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.7980## 19.5.1. defused packages8182[defusedxml](https://python-all.ru/3.2/library/xml.html) – это чистый Python-пакет с модифицированными подклассами всех XML-парсеров из стандартной библиотеки, которые предотвращают любые потенциально опасные операции. Эти меры рекомендуются для любого серверного кода, который обрабатывает ненадёжные XML-данные. Пакет также содержит примеры эксплойтов и расширенную документацию по другим XML-эксплойтам, таким как XPath-инъекция.8384[defusedexpat](https://python-all.ru/3.2/library/xml.html) предоставляет модифицированную libexpat и исправленную замену модуля расширения `pyexpat` с контрмерами против DoS-атак путём расширения сущностей. Defusedexpat по-прежнему допускает разумное и настраиваемое количество расширений сущностей. Эти модификации будут включены в будущие выпуски Python.8586Обходные пути и модификации не включены в патч-релизы, так как они нарушают обратную совместимость. В конечном счёте, встроенные DTD и расширение сущностей – это чётко определённые возможности XML.87