Saltar al contenido

libxml_set_external_entity_loader()

Hoy discutiremos la función libxml_set_external_entity_loader() en PHP. Esta función registra una devolución de llamada personalizada para manejar entidades externas en documentos XML, principalmente para prevenir ataques de Entidad Externa XML (XXE).

¿Qué es la función libxml_set_external_entity_loader()?

La función libxml_set_external_entity_loader() es una función integrada de PHP que registra una devolución de llamada personalizada para interceptar la carga de entidades externas en documentos XML. Introducida en PHP 5.1.0, se utiliza principalmente para proteger el análisis de XML contra vulnerabilidades XXE. Tenga en cuenta que PHP 8.0.0 actualizó la firma de la devolución de llamada para incluir anotaciones de tipo y un tipo de retorno, mejorando la seguridad de tipos y la compatibilidad.

Cómo usar la función libxml_set_external_entity_loader()

La función libxml_set_external_entity_loader() es fácil de usar. Define una devolución de llamada que recibe el ID público, el ID de sistema y el contexto de la entidad, y luego devuelve el contenido de la entidad como una cadena o null para bloquear la carga.

A continuación se muestra un ejemplo de cómo usar la función libxml_set_external_entity_loader():

¿Cómo usar la función libxml_set_external_entity_loader() en PHP?

php
<?php
// Define a custom function to load external entities
function my_entity_loader(?string $publicId, ?string $systemId, ?array $context): ?string
{
  // Block loading if systemId is missing or invalid to prevent XXE/SSRF
  if ($systemId === null || !is_string($systemId)) {
    return null;
  }

  // Load the external entity safely
  $content = @file_get_contents($systemId);
  return $content !== false ? $content : null;
}

// Set the custom entity loader function
libxml_set_external_entity_loader('my_entity_loader');

// Load an XML file into a DOMDocument object
$doc = new DOMDocument();
$doc->load('example.xml');
?>

En este ejemplo, definimos una devolución de llamada compatible con PHP 8 que valida el systemId y obtiene de forma segura la entidad utilizando file_get_contents(). Devolver null indica a libxml que omita la carga de la entidad, que es la forma estándar de bloquear recursos externos potencialmente peligrosos. Luego registramos la devolución de llamada con libxml_set_external_entity_loader() y cargamos el archivo XML.

Conclusión

La función libxml_set_external_entity_loader() es una herramienta fundamental para proteger el análisis de XML en PHP. Al interceptar las solicitudes de entidades externas, los desarrolladores pueden mitigar eficazmente los ataques XXE y controlar el acceso a los recursos. Esta guía cubrió el propósito de la función, los requisitos de firma de PHP 8 y un ejemplo de implementación segura.

Práctica

¿Cuál es el propósito principal de la función PHP libxml_set_external_entity_loader()?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.