Advertencia

¡Ayúdanos a traducir la documentación oficial de Python al Español! Puedes encontrar más información en Como contribuir. Ayuda a acercar Python a más personas de habla hispana.

Módulos de procesamiento XML

Código fuente: Lib/xml/


Las interfaces de Python para procesar XML están agrupadas en el paquete xml.

Advertencia

Los módulos XML no son seguros contra datos erróneos o construidos malintencionadamente. Si necesita analizar datos no confiables o no autenticados, consulte las secciones Vulnerabilidades XML y Paquetes defusedxml y defusedexpat.

Es importante tener en cuenta que los módulos del paquete xml requieren que haya al menos un analizador XML compatible con SAX disponible. El analizador Expat se incluye con Python, por lo que el módulo xml.parsers.expat siempre estará disponible.

La documentación de los paquetes xml.dom y xml.sax es la definición de los enlaces de Python para las interfaces DOM y SAX.

Los submódulos de manejo de XML son:

Vulnerabilidades XML

Los módulos de procesamiento XML no son seguros contra datos construidos malintencionadamente. Un atacante puede abusar de las características XML para llevar a cabo ataques de denegación de servicio, acceder a archivos locales, generar conexiones de red a otras máquinas o eludir firewalls.

En la tabla siguiente se ofrece una visión general de los ataques conocidos y si los distintos módulos son vulnerables a ellos.

tipo

sax

etree

minidom

pulldom

xmlrpc

mil millones de risas

Vulnerable

Vulnerable

Vulnerable

Vulnerable

Vulnerable

explosión cuadrática

Vulnerable

Vulnerable

Vulnerable

Vulnerable

Vulnerable

expansión de entidad externa

Seguro (4)

Seguro (1)

Seguro (2)

Seguro (4)

Seguro (3)

Recuperación de DTD

Seguro (4)

Seguro

Seguro

Seguro (4)

Seguro

bomba de descompresión

Seguro

Seguro

Seguro

Seguro

Vulnerable

  1. xml.etree.ElementTree no expande entidades externas y lanza un ParserError cuando se produce una entidad.

  2. xml.dom.minidom no expande entidades externas y simplemente retorna la entidad no expandida literalmente.

  3. xmlrpclib no expande entidades externas y las omite.

  4. Desde Python 3.7.1, las entidades generales externas ya no se procesan de forma predeterminada.

mil millones de risas / expansión exponencial de entidad

El ataque Billion Laughs, también conocido como expansión exponencial de entidades, utiliza varios niveles de entidades anidadas. Cada entidad hace referencia a otra entidad varias veces y la definición de entidad final contiene una cadena pequeña. La expansión exponencial da como resultado varios gigabytes de texto y consume mucha memoria y tiempo de CPU.

expansión de entidad de explosión cuadrática

Un ataque de explosión cuadrática es similar a un ataque de Billion Laughs; también abusa de la expansión de entidad. En lugar de entidades anidadas, repite una entidad grande con un par de miles de caracteres una y otra vez. El ataque no es tan eficaz como el caso exponencial, pero evita desencadenar contramedidas del analizador que prohíben entidades profundamente anidadas.

expansión de entidad externa

Las declaraciones de entidad pueden contener algo más que texto para su reemplazo. También pueden apuntar a recursos externos o archivos locales. El analizador XML tiene acceso al recurso e incrusta el contenido en el documento XML.

Recuperación de DTD

Algunas bibliotecas XML como xml.dom.pulldom de Python recuperan definiciones de tipo de documento de ubicaciones remotas o locales. La característica tiene implicaciones similares a las del problema de expansión de entidades externas.

bomba de descompresión

Las bombas de descompresión (también conocidas como ZIP bomb) se aplican a todas las bibliotecas XML que pueden analizar secuencias XML comprimidas, como secuencias HTTP comprimidas con gzip o archivos comprimidos por LZMA. Para un atacante puede reducir la cantidad de datos transmitidos en magnitudes de tres o más.

La documentación de defusedxml en PyPI tiene más información sobre todos los vectores de ataque conocidos con ejemplos y referencias.

Paquetes defusedxml y defusedexpat

defusedxml es un paquete Python puro con subclases modificadas de todos los analizadores XML stdlib que impiden cualquier operación potencialmente malintencionada. Se recomienda el uso de este paquete para cualquier código de servidor que analice datos XML que no sean de confianza. El paquete también incluye ataques de ejemplo y documentación ampliada sobre más vulnerabilidades XML, como la inyección de XPath.

defusedexpat proporciona un libexpat modificado y un módulo pyexpat parcheado que tienen contramedidas contra ataques DoS de expansión de entidad. El módulo defusedexpat todavía permite una cantidad sensata y configurable de expansiones de entidades. Las modificaciones pueden incluirse en alguna versión futura de Python, pero no se incluirán en ninguna versión de corrección de errores de Python porque rompen la compatibilidad con versiones anteriores.