libxml libxml_set_external_entity_loader
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
libxml_set_external_entity_loader — 기본 외부 엔티티 로더를 변경합니다.
설명
libxml_set_external_entity_loader(?callable $resolver_function
): bool
기본 외부 엔티티 로더를 변경합니다. 이는 각 작업에 대해 LIBXML_NOENT
가 설정된 경우에도 XXE 공격을 피하기 위해 임의의 외부 엔터티의 확장을 억제하는 데 사용할 수 있으며 일반적으로 libxml_disable_entity_loader()를 호출하는 것보다 선호됩니다.
매개변수
resolver_function
- 다음 서명이 있는 callable 가능:
resolver(string
$public_id
, string$system_id
, array$context
): resource|string|nullpublic_id
- 공개 ID입니다.
system_id
- 시스템 ID입니다.
context
"directory"
,"intSubName"
,"extSubURI"
및"extSubSystem"
요소가 있는 배열입니다.
이 콜러블은 리소스를 열 수 있는 문자열인 resource를 반환해야 합니다.
null
이 반환되면 엔터티 참조 확인이 실패합니다.
반환 값
성공하면 true
를, 실패하면 false
를 반환합니다.
Examples
예제 #1 libxml_set_external_entity_loader() 예제
<?php
$xml = <<<XML
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar">
<foo>bar</foo>
XML;
$dtd = <<<DTD
<!ELEMENT foo (#PCDATA)>
DTD;
libxml_set_external_entity_loader(
function ($public, $system, $context) use($dtd) {
var_dump($public);
var_dump($system);
var_dump($context);
$f = fopen("php://temp", "r+");
fwrite($f, $dtd);
rewind($f);
return $f;
}
);
$dd = new DOMDocument;
$r = $dd->loadXML($xml);
var_dump($dd->validate());
?>
위의 예는 다음을 출력합니다.
string(10) "-//FOO/BAR" string(25) "http://example.com/foobar" array(4) { ["directory"] => NULL ["intSubName"] => NULL ["extSubURI"] => NULL ["extSubSystem"] => NULL } bool(true)
기타
- libxml_disable_entity_loader() - 외부 엔터티 로드 기능 비활성화