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