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|null

public_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)
                

기타