Документация Python неофициальный перевод

xml.md

81 строк · 10.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.6/library/xml.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.4. Модули обработки XML89**Исходный код:** [Lib/xml/](https://python-all.ru/src/3.6/Lib/xml)1011---1213Интерфейсы Python для обработки XML объединены в пакете `xml`.1415> **Предупреждение**16>17> Модули XML не защищены от ошибочных или вредоносных данных. Если необходимо обрабатывать непроверенные или неаутентифицированные данные, обратитесь к разделам [Уязвимости XML](https://python-all.ru/3.6/library/xml.html#xml-vulnerabilities) и [Пакеты defusedxml и defusedexpat](https://python-all.ru/3.6/library/xml.html#defused-packages).1819Важно отметить, что модули в пакете [`xml`](https://python-all.ru/3.6/library/xml.html#module-xml) требуют наличия хотя бы одного SAX-совместимого анализатора XML. Анализатор Expat входит в состав Python, поэтому модуль [`xml.parsers.expat`](https://python-all.ru/3.6/library/pyexpat.html#module-xml.parsers.expat) всегда доступен.2021Документация пакетов [`xml.dom`](https://python-all.ru/3.6/library/xml.dom.html#module-xml.dom) и [`xml.sax`](https://python-all.ru/3.6/library/xml.sax.html#module-xml.sax) представляет собой описание привязок Python для интерфейсов DOM и SAX.2223Подмодули для работы с XML:2425- [`xml.etree.ElementTree`](https://python-all.ru/3.6/library/xml.etree.elementtree.html#module-xml.etree.ElementTree): API ElementTree, простой и легковесный процессор XML2627- [`xml.dom`](https://python-all.ru/3.6/library/xml.dom.html#module-xml.dom): определение API DOM28- [`xml.dom.minidom`](https://python-all.ru/3.6/library/xml.dom.minidom.html#module-xml.dom.minidom): минимальная реализация DOM29- [`xml.dom.pulldom`](https://python-all.ru/3.6/library/xml.dom.pulldom.html#module-xml.dom.pulldom): поддержка построения частичных DOM-деревьев3031- [`xml.sax`](https://python-all.ru/3.6/library/xml.sax.html#module-xml.sax): базовые классы SAX2 и вспомогательные функции32- [`xml.parsers.expat`](https://python-all.ru/3.6/library/pyexpat.html#module-xml.parsers.expat): привязка анализатора Expat3334## 20.4.1. Уязвимости XML3536Модули обработки XML не защищены от злонамеренно сконструированных данных. Злоумышленник может использовать возможности XML для проведения атак типа «отказ в обслуживании», доступа к локальным файлам, установления сетевых соединений с другими машинами или обхода межсетевых экранов.3738В следующей таблице представлен обзор известных атак и уязвимости различных модулей к ним.3940| Тип | sax | etree | minidom | pulldom | xmlrpc |41| --- | --- | --- | --- | --- | --- |42| Миллиард смешков | **Уязвим** (1) | **Уязвим** (1) | **Уязвим** (1) | **Уязвим** (1) | **Уязвим** (1) |43| Квадратичное разрастание | **Уязвим** (1) | **Уязвим** (1) | **Уязвим** (1) | **Уязвим** (1) | **Уязвим** (1) |44| раскрытие внешних сущностей | Безопасно (5) | Безопасен (2) | Безопасен (3) | Безопасно (5) | Безопасен (4) |45| получение [DTD](https://python-all.ru/3.6/library/xml.html) | Безопасно (5) | Безопасно | Безопасно | Безопасно (5) | Безопасно |46| бомба декомпрессии | Безопасно | Безопасно | Безопасно | Безопасно | **Уязвимо** |47481. Expat 2.4.1 и новее не уязвимы для атак «billion laughs» и «quadratic blowup». Элементы всё ещё отмечены как уязвимые из-за возможной зависимости от системных библиотек. Проверьте `pyexpat.EXPAT_VERSION`.492. [`xml.etree.ElementTree`](https://python-all.ru/3.6/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не раскрывает внешние сущности и возбуждает `ParserError` при обнаружении сущности.503. [`xml.dom.minidom`](https://python-all.ru/3.6/library/xml.dom.minidom.html#module-xml.dom.minidom) не раскрывает внешние сущности и просто возвращает неразвёрнутую сущность как есть.514. `xmlrpclib` не раскрывает внешние сущности и пропускает их.525. Начиная с Python 3.6.7, внешние общие сущности по умолчанию больше не обрабатываются.5354**миллиард смешков / экспоненциальное расширение сущностей**5556Атака [Billion Laughs](https://python-all.ru/3.6/library/xml.html) (миллиард смешков) – также известная как экспоненциальное расширение сущностей – использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а определение конечной сущности содержит небольшую строку. Экспоненциальное расширение приводит к получению нескольких гигабайт текста и потребляет много памяти и процессорного времени.5758**квадратичное расширение сущностей**5960Атака квадратичного раздувания похожа на атаку [Миллиард смешков](https://python-all.ru/3.6/library/xml.html); она тоже злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность длиной в пару тысяч символов снова и снова. Атака не так эффективна, как экспоненциальный случай, но она избегает срабатывания защитных механизмов парсера, которые запрещают глубоко вложенные сущности.6162**раскрытие внешних сущностей**6364Объявления сущностей могут содержать не только текст для замены. Они могут также указывать на внешние ресурсы или локальные файлы. XML-парсер обращается к ресурсу и встраивает содержимое в XML-документ.6566**получение [DTD](https://python-all.ru/3.6/library/xml.html)**6768Некоторые XML-библиотеки, такие как [`xml.dom.pulldom`](https://python-all.ru/3.6/library/xml.dom.pulldom.html#module-xml.dom.pulldom) в Python, извлекают определения типа документа из удалённых или локальных источников. Эта функция имеет схожие последствия с проблемой раскрытия внешних сущностей.6970**бомба декомпрессии**7172Бомбы декомпрессии (также известные как [ZIP bomb](https://python-all.ru/3.6/library/xml.html)) применимы ко всем библиотекам XML, которые могут анализировать сжатые потоки XML, такие как gzipped HTTP-потоки или файлы, сжатые LZMA. Для злоумышленника это может уменьшить объем передаваемых данных на три порядка и более.7374Документация [defusedxml](https://python-all.ru/3.6/library/xml.html) на PyPI содержит дополнительную информацию о всех известных векторах атак с примерами и ссылками.7576## 20.4.2. Пакеты `defusedxml` и `defusedexpat`7778[defusedxml](https://python-all.ru/3.6/library/xml.html) – это чистый пакет Python с модифицированными подклассами всех XML-парсеров стандартной библиотеки, которые предотвращают любые потенциально вредоносные операции. Использование этого пакета рекомендуется для любого серверного кода, который разбирает непроверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по дополнительным XML-эксплойтам, таким как XPath-инъекция.7980[defusedexpat](https://python-all.ru/3.6/library/xml.html) предоставляет модифицированный libexpat и исправленный `pyexpat` модуль, содержащие меры противодействия атакам DoS за счет расширения сущностей. Модуль `defusedexpat` по-прежнему допускает разумное и настраиваемое количество расширений сущностей. Эти изменения могут быть включены в один из будущих выпусков Python, но не будут включены в выпуски с исправлениями ошибок Python, поскольку нарушают обратную совместимость.81