JSON vs. XML: ¿Cuál es más vulnerable a ataques?
Comparamos la seguridad de JSON vs. XML, analizando vulnerabilidades críticas como XXE e inyección de datos para proteger tus APIs de ataques informáticos.

Al evaluar JSON vs. XML, la seguridad y la susceptibilidad a ataques es un factor determinante para elegir el formato de datos de tu aplicación. En la arquitectura web moderna, el intercambio de datos entre clientes y servidores sustenta la lógica de miles de millones de aplicaciones web y de escritorio. Aunque JSON y XML son los formatos de serialización de texto más extendidos en las APIs de todo el mundo, la forma en que cada uno de ellos estructura y procesa la información tiene implicaciones de seguridad abismales.
En este artículo técnico, analizaremos los vectores de ataque específicos que afectan a JSON y XML, compararemos sus perfiles de riesgo y te mostraremos cómo asegurar tus analizadores de datos para prevenir incidentes que pongan en peligro la infraestructura informática de tu organización.
¿Por qué la seguridad de los formatos de datos es crítica?
El formato que eliges para transferir datos no es una simple cuestión estática. Cuando un servidor recibe un payload en JSON o XML, debe utilizar una librería específica (analizador o parser) para deserializar esa cadena de texto y convertirla en objetos de memoria con los que el lenguaje de programación pueda interactuar.
El riesgo de seguridad no reside únicamente en los datos que viajan por la red, sino en las características del propio formato y en el diseño del analizador que los procesa. Si un formato de datos incluye características que permiten al analizador ejecutar código, consultar recursos externos o acceder al sistema de archivos local, el formato en sí se convierte en una vía directa de explotación de software.
Un procesamiento inadecuado de entradas puede abrir vulnerabilidades tan destructivas como la inyección de comandos o ejecuciones de código arbitrario. Esto guarda una estrecha relación con fallos del sistema operativo o editores que ejecutan herramientas locales sospechosas de forma automática, como se documentó recientemente en la vulnerabilidad de ejecución de código en Cursor IDE por Git malicioso.
XML y la pesadilla de las Entidades Externas (XXE)
XML (eXtensible Markup Language) es un estándar muy potente desarrollado a finales de los años 90. Al ser diseñado para manejar estructuras complejas de documentos, incluye características muy avanzadas, como los esquemas XML, los espacios de nombres y las Definiciones de Tipo de Documento (DTD).
El talón de Aquiles de la seguridad en XML reside precisamente en las DTD y la capacidad de declarar Entidades Externas XML (XXE). Las entidades externas permiten a un archivo XML cargar dinámicamente recursos ubicados en otras partes del sistema o en servidores remotos.
Ejemplo de exploit XXE
Considera el siguiente código XML malicioso enviado por un atacante a un servidor que procesa facturas electrónicas:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE datos [
<!ENTITY archivo SYSTEM "file:///etc/passwd">
]>
<usuario>
<nombre>&archivo;</nombre>
<rol>invitado</rol>
</usuario>
Si el analizador XML del servidor tiene habilitado el soporte de DTD y entidades externas:
- Leerá la declaración del sistema
file:///etc/passwd. - Reemplazará la entidad
&archivo;con el contenido real del archivo de usuarios del sistema operativo Linux. - Al renderizar el valor del nodo
<nombre>, el servidor devolverá involuntariamente el contenido de/etc/passwdal atacante.
Además de la lectura de archivos locales, los ataques XXE pueden derivar en Falsificación de Peticiones del Lado del Servidor (SSRF), permitiendo al atacante escanear la red interna de la empresa detrás del cortafuegos, o en ataques de Denegación de Servicio (DoS), como la famosa "Bomba XML" (o Billion Laughs), que agota la memoria del servidor expandiendo entidades de forma exponencial.
JSON y sus riesgos específicos
JSON (JavaScript Object Notation) nació como una alternativa ligera a XML. Se diseñó específicamente para mapear de forma directa estructuras de datos sencillas (objetos, arreglos, cadenas, números y booleanos) sin características complejas de metadatos o esquemas.
Al carecer de DTD, entidades externas y procesamiento de archivos del sistema, JSON es intrínsecamente mucho más seguro que XML. Sin embargo, no es inmune a ataques:
- Inyección de Prototipos (Prototype Pollution): En aplicaciones escritas en JavaScript (Node.js), el análisis inseguro de objetos JSON modificados por el usuario puede alterar las propiedades del prototipo base del lenguaje. Esto permite a los atacantes inyectar código o alterar el comportamiento de la lógica del backend.
- Denegación de Servicio (JSON DoS): Si un servidor no limita la profundidad del anidamiento en las cadenas JSON recibidas, un atacante puede enviar un objeto con miles de llaves anidadas (ej.
[[[[...]]]]). El analizador consumirá una gran cantidad de memoria y tiempo de CPU tratando de deserializar el payload, provocando la caída del servicio. - JSON Injection: Cuando la cadena JSON se construye mediante concatenación manual de strings en lugar de funciones de serialización seguras, un atacante puede insertar comillas y comas para manipular la estructura final del objeto enviado a la base de datos o APIs de terceros.
Tabla Comparativa de Seguridad: JSON vs. XML
A continuación, se presenta una tabla detallada con las diferencias en materia de seguridad entre ambos formatos de datos:
| Vector de Ataque / Característica | JSON | XML |
|---|---|---|
| Ataques XXE (External Entities) | Inexistente (no soporta entidades) | Altamente vulnerable por defecto |
| SSRF (Server-Side Request Forgery) | Raro (solo por lógica de aplicación) | Frecuente (vía entidades externas) |
| Ataque DoS por Expansión de Entidad | Inexistente | Muy vulnerable (Billion Laughs) |
| Denegación de Servicio por Anidamiento | Posible (si no se limita profundidad) | Posible |
| Inyección de Código / Prototipos | Posible en ciertos analizadores JS | Raro |
| Complejidad del Formato | Baja (fácil de validar y parsear) | Alta (muchas especificaciones legadas) |
| Postura de Seguridad por Defecto | Segura (los parsers son simples) | Insegura (muchas librerías activan DTD) |
Buenas prácticas para asegurar el procesamiento de datos
Independientemente del formato que elijas, la seguridad de tu infraestructura depende del endurecimiento de tus analizadores. Sigue estas recomendaciones:
- Deshabilita las DTD en XML: La defensa número uno contra XXE es configurar explícitamente el analizador de XML para desactivar la resolución de DTD externas e inline.
- Evita la concatenación manual: Construye tus payloads utilizando librerías validadas como
JSON.stringify()en JavaScript o equivalentes en otros lenguajes. Esto previene la inyección de datos. - Valida esquemas de entrada: Utiliza esquemas estrictos (como JSON Schema) para verificar que la información recibida coincida exactamente con los tipos de datos esperados.
- Establece límites de tamaño y anidamiento: Limita el tamaño del payload máximo en tus servidores web y configura tu parser para rechazar objetos con demasiada profundidad.
En entornos de producción, la validación del código y la realización de auditorías de vulnerabilidad son esenciales. Si deseas entender el alcance de estas metodologías, te recomendamos leer sobre las diferencias entre la auditoría de vulnerabilidades con IA y el pentesting humano.
Si manejas credenciales de acceso dentro de tus archivos de configuración JSON o XML, recuerda que nunca deben almacenarse en texto plano en repositorios Git. Consulta nuestra guía sobre cómo compartir contraseñas de forma segura en Internet para proteger tus credenciales.
Herramientas recomendadas
Para garantizar que tus payloads JSON sean correctos antes de ser procesados por tus servidores, es crucial validar su sintaxis y estructura mediante herramientas de confianza.
En TecnoCrypter hemos creado el Validador JSON. Esta herramienta web funciona completamente en el lado del cliente (en tu navegador), permitiéndote inspeccionar, formatear y verificar la validez de tus estructuras de datos JSON de forma 100% confidencial, sin enviar la información a través de la red.
Conclusión
Al comparar la seguridad de JSON vs. XML, XML se posiciona claramente como el formato más vulnerable debido a su especificación de entidades externas (XXE) y su alta complejidad inherente. JSON, al eliminar las características legadas complejas del DTD, ofrece una superficie de ataque mucho más reducida y controlable por los desarrolladores.
Sin embargo, ningún formato es seguro por sí mismo si no se configuran correctamente las librerías encargadas de deserializar la información. Un enfoque defensivo sólido, la validación rigurosa de entradas y el uso de validadores locales son requisitos indispensables para mantener seguras tus APIs.
Fuentes y lecturas recomendadas:
- OWASP XXE Prevention Cheat Sheet — Guía definitiva de OWASP para prevenir inyecciones de Entidades Externas XML en diferentes lenguajes.
- W3C XML Recommendation — La especificación oficial de XML que describe el estándar DTD y las entidades.
- ECMA-404 JSON Data Interchange Standard — Estándar oficial de la especificación sintáctica del formato JSON.
- Artículo relacionado en TecnoCrypter: Auditoría de Vulnerabilidades: IA vs Pentesting Humano
- Artículo relacionado en TecnoCrypter: Cómo compartir contraseñas de forma segura en Internet


