Volver a la wiki

Servicio: Sanitizador SVG (allowlist, defusedxml)

Descripción

Módulo: racks/utils/svg_sanitizer.py

Sanitizador de SVG con estrategia allowlist usando defusedxml.ElementTree, integrado en el flujo de importación de stencils. Elimina vectores de XSS en SVG subido por usuario, generado por conversión Visio, o manipulado en requests.

Funciones públicas

sanitize_svg(svg_text: str) → str

Recibe string SVG, devuelve versión limpia. Lanza ValueError si no es SVG válido.

Lógica:

  1. Parse defensivo con defusedxml.ElementTree (bloquea billion-laughs, external entities)
  2. Verifica raíz es <svg>
  3. Limpia atributos peligrosos (recursivo DFS)
  4. Re-serializa con namespaces registrados

Elementos permitidos (21 elementos):

Atributos bloqueados (eliminados sin excepción):

sanitize_svg_file(path: str) → None

Limpia un fichero SVG in-place. Lanza ValueError si no es SVG válido.

Uso:

try:
    sanitize_svg_file("/path/to/stencil.svg")
except ValueError as e:
    # Fichero no es SVG válido
    logger.error("Invalid SVG: %s", e)

Puntos de aplicación

  1. Subida directa de SVG (POST /api/racks/visio/analyze): SVG de usuario entra crudo → sanitizar antes del preview
  2. SVG generado por libvisio-ng (task convert_visio_async): cada página convertida → sanitizar antes de quedar disponible
  3. Gate final en confirm (POST /api/racks/visio/confirm): second pass, cubre sesiones manipuladas

Defensa en profundidad: si la lógica aguas arriba fallara, confirm atrapa XSS residual.

Detalles de implementación

Localización de nombres de tags/atributos

Bloqueo de referencias externas

Regex: url\s*\(\s*['\"]?\s*(?!#) — detecta url(http://...), url(/path), etc. pero permite url(#interno)

Recursos embebidos legítimos

Testing

Cubierto en tests/api/test_visio_import_v2.py:

Véase también

Subir