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
// 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()?