Перейти к содержимому

libxml_set_external_entity_loader()

Сегодня мы обсудим функцию libxml_set_external_entity_loader() в PHP. Эта функция регистрирует пользовательский обратный вызов для обработки внешних сущностей в XML-документах, в первую очередь для предотвращения атак XML External Entity (XXE).

Что такое функция libxml_set_external_entity_loader()?

Функция libxml_set_external_entity_loader() — это встроенная функция PHP, которая регистрирует пользовательский обратный вызов для перехвата загрузки внешних сущностей в XML-документах. Появившись в PHP 5.1.0, она в первую очередь используется для защиты парсинга XML от уязвимостей XXE. Обратите внимание, что в PHP 8.0.0 сигнатура обратного вызова была обновлена для включения аннотаций типов и типа возвращаемого значения, что повысило безопасность типов и совместимость.

Как использовать функцию libxml_set_external_entity_loader()

Функция libxml_set_external_entity_loader() проста в использовании. Вы определяете обратный вызов, который принимает публичный ID, системный ID и контекст сущности, а затем возвращает содержимое сущности в виде строки или null, чтобы заблокировать загрузку.

Ниже приведен пример использования функции libxml_set_external_entity_loader():

Как использовать функцию libxml_set_external_entity_loader() в 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');
?>

В этом примере мы определяем обратный вызов, совместимый с PHP 8, который проверяет systemId и безопасно загружает сущность с помощью file_get_contents(). Возврат null указывает libxml пропустить загрузку сущности, что является стандартным способом блокировки потенциально опасных внешних ресурсов. Затем мы регистрируем обратный вызов с помощью libxml_set_external_entity_loader() и загружаем XML-файл.

Заключение

Функция libxml_set_external_entity_loader() является критически важным инструментом для обеспечения безопасности парсинга XML в PHP. Перехватывая запросы к внешним сущностям, разработчики могут эффективно предотвращать атаки XXE и контролировать доступ к ресурсам. В этом руководстве рассмотрены назначение функции, требования к сигнатуре в PHP 8 и пример безопасной реализации.

Практика

Какова основная цель функции PHP libxml_set_external_entity_loader()?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.