Модули обработки XML
Исходный код: Lib/xml/
Интерфейсы Python для обработки XML сгруппированы в пакете xml.
Предупреждение
Модули XML не защищены от ошибочных или злонамеренно сконструированных данных. Если вам нужно анализировать недоверенные или неавторизованные данные, см. разделы Уязвимости XML и Пакеты defusedxml и defusedexpat.
Важно отметить, что модули в пакете xml требуют наличия по крайней мере одного SAX-совместимого парсера XML. Парсер Expat включён в Python, поэтому модуль xml.parsers.expat всегда будет доступен.
Документация для пакетов xml.dom и xml.sax представляет собой определение Python-связей для интерфейсов DOM и SAX.
Подмодули обработки XML:
-
xml.etree.ElementTree: интерфейс ElementTree, простой и лёгкий процессор XML
-
xml.dom: определение интерфейса DOM -
xml.dom.minidom: минимальная реализация DOM -
xml.dom.pulldom: поддержка создания частичных деревьев DOM
-
xml.sax: базовые классы SAX2 и удобные функции -
xml.parsers.expat: привязка парсера Expat
Уязвимости XML
Модули обработки XML не защищены от злонамеренно сконструированных данных. Злоумышленник может использовать возможности XML для организации атак типа «отказ в обслуживании», доступа к локальным файлам, создания сетевых соединений с другими машинами или обхода брандмауэров.
В следующей таблице приведён обзор известных атак и уязвимости различных модулей к ним.
Тип | sax | etree | minidom | pulldom | xmlrpc |
|---|---|---|---|---|---|
«миллиард хохотов» | Уязвим | Уязвим | Уязвим | Уязвим | Уязвим |
Квадратичный взрыв | Уязвим | Уязвим | Уязвим | Уязвим | Уязвим |
Расширение внешних сущностей | Безопасно (4) | Безопасно (1) | Безопасно (2) | Безопасно (4) | Безопасно (3) |
Получение DTD | Безопасно (4) | Безопасно | Безопасно | Безопасно (4) | Безопасно |
Бомба сжатия | Безопасно | Безопасно | Безопасно | Безопасно | Уязвим |
-
xml.etree.ElementTreeне расширяет внешние сущности и генерируетParserError, когда встречается сущность. -
xml.dom.minidomне расширяет внешние сущности и просто возвращает нерасширенную сущность дословно. -
xmlrpclibне расширяет внешние сущности и пропускает их. - Начиная с Python 3.7.1, внешние общие сущности по умолчанию больше не обрабатываются.
- «миллиард хохотов»/экспоненциальное расширение сущностей
-
Атака «миллиард хохотов» (также известная как экспоненциальное расширение сущностей) использует несколько уровней вложенных сущностей. Каждая сущность ссылается на другую сущность несколько раз, а окончательное определение сущности содержит небольшую строку. Экспоненциальное расширение приводит к нескольким гигабайтам текста и потребляет много памяти и времени ЦП.
- Квадратичное расширение сущностей
-
Атака с квадратичным взрывом аналогична атаке «миллиард хохотов»; она также злоупотребляет расширением сущностей. Вместо вложенных сущностей она повторяет одну большую сущность с парой тысяч символов снова и снова. Эта атака не так эффективна, как экспоненциальный случай, но она избегает срабатывания мер предосторожности парсера, запрещающих глубоко вложенные сущности.
- Расширение внешних сущностей
-
Объявления сущностей могут содержать больше, чем просто текст для замены. Они также могут указывать на внешние ресурсы или локальные файлы. Парсер XML получает доступ к ресурсу и встраивает его содержимое в документ XML.
- Получение DTD
-
Некоторые XML-библиотеки, такие как Python
xml.dom.pulldom, получают определения типов документов из удалённых или локальных мест. Эта функция имеет аналогичные последствия, как и проблема расширения внешних сущностей. - Бомба сжатия
-
Бомбы сжатия (также известные как бомба ZIP) применимы ко всем XML-библиотекам, которые могут анализировать сжатые потоки XML, такие как сжатые с помощью gzip HTTP-потоки или файлы, сжатые с помощью LZMA. Для злоумышленника это может уменьшить объём передаваемых данных в три и более раз.
Документация по defusedxml на PyPI содержит дополнительную информацию обо всех известных векторах атаки с примерами и ссылками.
Пакеты defusedxml и defusedexpat
defusedxml — это чистый Python-пакет с изменёнными подклассами всех XML-парсеров stdlib, которые предотвращают любые потенциально вредоносные операции. Рекомендуется использовать этот пакет для любого серверного кода, который анализирует недоверенные XML-данные. Пакет также поставляется с примерами эксплойтов и расширенной документацией по другим эксплойтам XML, таким как XPath-инъекция.
defusedexpat предоставляет изменённый libexpat и исправленный модуль pyexpat, которые имеют меры предосторожности против атак DoS с расширением сущностей. Модуль defusedexpat по-прежнему позволяет разумное и настраиваемое количество расширений сущностей. Изменения могут быть включены в будущих версиях Python, но не будут включены в какие-либо исправления Python, потому что они нарушают обратную совместимость.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/xml.html