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

---

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

**Исходный код:** [Lib/xml/](https://python-all.ru/src/3.15/Lib/xml)

---

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

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

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

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

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

- [`xml.etree.ElementTree`](https://python-all.ru/3.15/library/xml.etree.elementtree.html#module-xml.etree.ElementTree): API ElementTree, простой и легковесный процессор XML

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

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

Этот модуль также определяет вспомогательные функции.

#### `xml.is_valid_name(name)`

Возвращает `True`, если строка является допустимым именем элемента или атрибута, иначе `False`.

Почти все символы разрешены в именах, за исключением управляющих символов и тех, которые являются или могут обоснованно использоваться в качестве разделителей. Символы, такие как «:», «-», «.», «\_» и «·», разрешены, а «\<», «/», «!», «?», и «=» запрещены. Имя не может начинаться с цифры или символа, такого как «-», «.» и «·».

Добавлено в версии 3.15.

#### `xml.is_valid_text(data)`

Возвращает `True`, если строка является последовательностью допустимых символов XML 1.0, иначе `False`.

Почти все символы разрешены в документах XML 1.0, за исключением управляющих символов C0 (кроме TAB, CR и LF), суррогатных символов и специальных символов Unicode U+FFFE и U+FFFF.

Добавлено в версии 3.15.

## Безопасность XML

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

Встроенные анализаторы XML в Python полагаются на библиотеку [libexpat](https://python-all.ru/3.15/library/xml.html), обычно называемую Expat, для разбора XML.

По умолчанию сам Expat не обращается к локальным файлам и не создает сетевые подключения.

Версии Expat ниже 2.7.2 могут быть уязвимы к атакам «миллиард смешков», «квадратичный взрыв» и «большие токены», а также к непропорциональному использованию динамической памяти. Python включает в себя копию Expat, и то, использует ли Python встроенную или системную версию Expat, зависит от того, как интерпретатор Python [`has been configured`](https://python-all.ru/3.15/using/configure.html#cmdoption-with-system-expat) в вашем окружении. Python может быть уязвим, если он использует такие старые версии Expat. Проверьте `pyexpat.EXPAT_VERSION`.

[`xmlrpc`](https://python-all.ru/3.15/library/xmlrpc.html#module-xmlrpc) **уязвим** к атаке «бомба декомпрессии».

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

Атака [Billion Laughs](https://python-all.ru/3.15/library/xml.html) (миллиард смешков) – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение конечной сущности содержит небольшую строку. Экспоненциальное расширение приводит к получению нескольких гигабайт текста и потребляет много памяти и процессорного времени.

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

Атака квадратичного взрыва аналогична атаке [Billion Laughs](https://python-all.ru/3.15/library/xml.html); она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она многократно повторяет одну большую сущность длиной в несколько тысяч символов. Такая атака не так эффективна, как экспоненциальная, но она позволяет обходить меры противодействия анализатора, запрещающие глубоко вложенные сущности.

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

Бомбы декомпрессии (также известные как [ZIP bomb](https://python-all.ru/3.15/library/xml.html)) применимы ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как gzipped HTTP-потоки или файлы, сжатые LZMA. Для злоумышленника это может уменьшить объем передаваемых данных на три порядка и более.

**большие токены**

Expat вынужден повторно разбирать незавершенные токены; без защиты, введенной в Expat 2.6.0, это может привести к квадратичному времени выполнения, которое может быть использовано для отказа в обслуживании в приложении, разбирающем XML. Проблема известна как [**CVE 2023-52425**](https://python-all.ru/3.15/library/xml.html).
