Guía Completa: Manejo de Entidades en Fast XML Parser

Fast XML Parser es una biblioteca eficaz para validar, analizar y construir XML sin depender de bibliotecas basadas en C/C++ ni requerir callbacks. En este artículo exploraremos a fondo el tratamiento de entidades en Fast XML Parser, permitiéndote gestionar XML de forma segura y eficiente.

¿Qué son las entidades en XML?

En XML, las entidades actúan como variables que mantienen la consistencia del contenido. Por ejemplo, puedes definir una entidad para un símbolo de copyright y reutilizarla en distintos puntos del documento. Fast XML Parser admite varios tipos de entidades y ofrece opciones de configuración para controlar cómo se procesan.

Ejemplo de entidad

<?xml version="1.0" encoding="UTF-8"?>

  <!ENTITY copyright "Copyright: W3Schools.">
]>
<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Recordatorio</heading>
    <body attr="&writer;">¡No me olvides este fin de semana!</body>
    <footer>&writer;&nbsp;&copyright;</footer>
</note>

Fast XML Parser reconoce de forma nativa las siguientes entidades XML:

Nombre Carácter Rfeerencia decimal Referencia hexadecimal
quot " &#34; &#x22;
amp & &#38; &#x26;
apos ' &#39; &#x27;
lt < &#60; &#x3C;
gt > &#62; &#x3E;

Configuración detallada de processEntities

La opción processEntities es el control principal para gestionar entidades durante el análisis XML. Acepta valores de tipo booleano u objeto, con true como valor predeterminado. Ofrece dos modos de uso: básico y avanzado.

Uso básico

// Deshabilitar el procesamiento de entidades (recomendado para XML no confiable)
const parser = new XMLParser({
  processEntities: false
});

// Habilitar el procesamiento con restricciones de seguridad por defecto
const parser = new XMLParser({
  processEntities: true
});

Configuración avanzada de límites de seguridad

Cuando se activa processEntities: true, el analizador aplica límites automáticos para prevenir ataques de denegación de servicio. Puedes personalizar estos límites según tus necesidades:

const parser = new XMLParser({
  processEntities: {
    enabled: true,               // Interruptor principal
    maxEntitySize: 10000,        // Tamaño máximo por entidad (10 KB)
    maxTotalExpansions: 1000,    // Número máximo de sustituciones de entidades (1000)
    maxExpandedLength: 100000   // Longitud máxima del contenido expandido (100 KB)
  }
});

Comportamiento según la configuración

Con processEntities = false:

  • El analizador detecta las etiquetas <!DOCTYPE> y <!ENTITY>
  • Las referencias a entidades (como &writer;) no se reemplazan y se conservan textualmente
  • Se previenen ataques de expansión de entidades, aunque se permite el análisis de DOCTYPE
  • Ideal para: APIs públicas, fuentes XML no confiables, escenarios de máxima seguridad

Con processEntities = true:

  • El analizador reemplaza activamente todas las referencias &entidad; por sus valores definidos
  • Los límites de seguridad evitan el agotamiento de recursos
  • Ideal para: sistemas internos, fuentes XML confiables, escenarios que requieren uso de entidades

Mecanismos de protección de seguridad

Fast XML Parser incorpora varias capas defensivas contra ataques de expansión de entidades:

  1. Límite de tamaño de entidad: Evita que una única entidad sea demasiado grande
  2. Límite de conteo de expansiones: Previene un número excesivo de sustituciones
  3. Límite de tamaño total: Controla la longitud máxima del contenido expandido
  4. Bloqueo de entidades paramétricas: Ignora automáticamente entidades que contienen &

Estas medidas protegen contra:

  • Ataque Billion Laughs (expansión exponencial de entidades)
  • Ataques de agotamiento de memoria
  • Ataques de agotamiento de CPU

Manejo de entidades en XML Builder

El constructor XML (XML Builder) decodifica automáticamente las entidades predeterminadas. Por ejemplo:

const jsObj = {
    "nota": {
        "@titulo": "Recordatorio > \"Alerta",
        "cuerpo": {
            "#text": " 3 < 4",
            "atributo": "Escritor: Donald Duck."
        },
    }
};

const opciones = {
    attributeNamePrefix: "@",
    ignoreAttributes: false,
};
const builder = new XMLBuilder(opciones);
const salida = builder.build(jsObj);

Salida generada:

<nota titulo="Recordatorio &gt; &quot;Alerta">
    <cuerpo>
        3 &lt; 4
        <atributo>Escritor: Donald Duck.</atributo>
    </cuerpo>
</nota>

Soporte para entidades HTML

Al activar la opción htmlEntities: true, Fast XML Parser reconoce las siguientes entidades HTML:

Resultado Descripción Nombre de entidad Número de entidad
espacio de no separación &nbsp; &#160;
< menor que &lt; &#60;
> mayor que &gt; &#62;
& ampersand &amp; &#38;
" comilla doble &quot; &#34;
' comilla simple &apos; &#39;
¢ centavo &cent; &#162;
£ libra &pound; &#163;
¥ yen &yen; &#165;
euro &euro; &#8364;
© copyright &copy; &#169;
® marca registrada &reg; &#174;
rupia india &inr; &#8377;

Además, se admiten referencias numéricas de caracteres, tanto en decimal (&#123;) como en hexadecimal (&#x7B;).

Entidades externas

Puedes añadir entidades externas mediante código sin necesidad de usar DOCTYPE:

const datosXML = `<nota>&desconocida;&#xD;último</nota>`;

const parser = new XMLParser();
parser.addEntity("#xD", "\r");
let resultado = parser.parse(datosXML); // Salida: &desconocida;\rúltimo

Este método también permite sobrescribir entidades predeterminadas. Las entidades añadidas de esta forma omiten la validación de DOCTYPE, pero siguen sujetas a los mismos límites de seguridad cuando processEntities está activado.

Comparativa de rendimiento

Fast XML Parser mantiene una velocidad de análisis excepcional incluso con el procesamiento de entidades habilitado. En diversas pruebas, supera a otros analizadores al manejar XML con entidades, especialmente en modo de preservación de orden.

Recomendaciones de buenas prácticas

  1. Para XML no confialbe: Utiliza processEntities: false para máxima seguridad
  2. Para XML confiable con entidades: Emplea processEntities: true (los límites predeterminados son seguros)
  3. Para necesidades de seguridad personalizadas: Ajusta los parámetros de límite según tus requisitos
  4. Para manejar el símbolo & literal: En el documento XML, usa &amp; para representar el & literal
  5. Para optimizar el rendimiento: Si el documento XML no contiene entidades, desactiva processEntities: false para mejorar la velocidad

Con una configuración adecuada del manejo de entidades, puedes aprovechar al máximo las capacidades de Fast XML Parser mientras mantienes la seguridad y eficiencia al procesar documentos XML.

Etiquetas: Fast XML Parser XML entities processEntities XML security entity expansion attack

Publicado el 7-1 04:59