현재 위치: > 최신 기사 목록> libxml_use_internal_errors 및 libxml_disable_entity_loader 함수와 함께 외부 엔티티 공격을 방지하는 방법?

libxml_use_internal_errors 및 libxml_disable_entity_loader 함수와 함께 외부 엔티티 공격을 방지하는 방법?

gitbox 2025-06-16

최신 웹 개발에서 XML은 데이터 교환, 구성 파일 및 기타 여러 시나리오에 널리 사용됩니다. 그러나 XML 구문 분석 중에 방지되지 않으면 외부 엔티티 공격 (XXE, XML 외부 엔티티 공격)의 취약점이 될 수 있습니다. XXE 공격을 통해 공격자는 XML 파일을 통해 악의적 인 컨텐츠를 주입하여 정보 유출, 서비스 거부 (DOS) 또는 악의적 코드 실행이 발생할 수 있습니다.

이 문제를 해결하기 위해 PHP는 외부 엔터티 공격을 방지하기위한 몇 가지 내장 기능을 제공합니다. 그중에서도 libxml_use_internal_errors ()libxml_disable_entity_loader () 는 두 가지 매우 효과적인 보호 방법입니다. 이 기사는 외부 엔터티 공격을 방지하기 위해이 두 기능을 결합하는 방법을 자세히 설명합니다.

1. 외부 엔티티 공격 (XXE)이란 무엇입니까?

외부 엔티티 공격 (XXE)은 XML 파일의 외부 엔티티 선언에 의해 수행되는 공격입니다. XML 파일은 시스템 파일, URL 또는 기타 외부 리소스 일 수있는 외부 리소스를 참조 할 수 있습니다. 공격자는 파일 컨텐츠를 민감한 정보에 가리키거나 서버가 악의적으로 구성된 XML 파일을 통해 불안한 작업을 수행하도록 할 수 있습니다.

예를 들어, 공격자는 XML 파일을 다음 형식으로 구성 할 수 있습니다.

 <!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>

이 시점에서 XML 파서는 시스템의 /etc /passwd 파일을 읽고 내용을 데이터 요소에 주입하려고합니다. 이러한 공격은 민감한 데이터 유출로 이어질 수 있습니다.

2. libxml_use_internal_errors ()를 사용하여 XML 오류를 처리하는 방법?

XML 데이터를 처리 할 때 PHP는 기본적으로 오류를 구문 분석 할 때 경고 또는 오류가 발생하여 너무 많은 오류 메시지를 노출시킬 수 있습니다. libxml_use_internal_errors ()를 사용하여 이러한 기본 오류 출력을 끄고 내부 오류 처리 메커니즘을 사용하십시오. 이런 식으로 XML 데이터가 잘못되었거나 잠재적 인 취약성이 있더라도 프로그램은 상세한 오류 정보를 노출시키지 않습니다.

샘플 코드 :

 libxml_use_internal_errors(true);

$xmlString = '<root><data>&xxe;</data></root>';
$xml = simplexml_load_string($xmlString);

if ($xml === false) {
    echo "짐 XML 오류가 발생했습니다。\n";
    foreach(libxml_get_errors() as $error) {
        echo $error->message . "\n";
    }
}

이 예에서 Libxml_use_internal_errors (true)는 XML 파일에 문제가있는 경우 프로그램에 직접 경고를 던지지 않도록합니다. 오류 메시지는 내부적으로 저장되며 libxml_get_errors () 를 통해 얻을 수 있습니다.

3. libxml_disable_entity_loader ()를 사용하여 외부 엔티티로드를 비활성화하는 방법?

libxml_disable_entity_loader ()는 개발자가 XML 파서의 외부 엔티티로드 기능을 비활성화하여 XXE 공격을 효과적으로 피할 수있는 또 다른 핵심 기능입니다. 외부 엔티티로드가 비활성화되면 XML 파서는 원격 자원 또는 시스템 파일을로드 할 수 없습니다.

샘플 코드 :

 libxml_disable_entity_loader(true);

$xmlString = '<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>';

$xml = simplexml_load_string($xmlString);

if ($xml === false) {
    echo "XML 짐失败,외부 엔티티가 비활성화되어 있습니다。\n";
}

이 예에서는 libxml_disable_entity_loader (true)가 외부 엔티티의로드를 비활성화하여 공격자가 XML 파일을 통해 외부 리소스를로드 할 수 없으며 XML 파일에 외부 엔터티 선언이 포함되어 있어도 구문 분석기가 실행되지 않습니다.

4. xxe 공격을 방지하기 위해 libxml_use_internal_errors ()libxml_disable_entity_loader ()를 사용하십시오.

외부 엔티티 공격을 효과적으로 방지하기 위해 XML을 구문 분석 할 때 오류 출력을 억제하고 외부 엔티티 로딩이 비활성화 될 수 있도록이 두 기능을 조합하여 사용할 수 있습니다.

포괄적 인 샘플 코드 :

 libxml_use_internal_errors(true);
libxml_disable_entity_loader(true);

$xmlString = '<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>';

$xml = simplexml_load_string($xmlString);

if ($xml === false) {
    echo "XML 짐失败。\n";
    foreach(libxml_get_errors() as $error) {
        echo $error->message . "\n";
    }
}

이 예에서는 libxml_use_internal_errors (true)가 구문 분석 중에 오류 메시지를 숨기는 데 사용되는 반면, libxml_disable_entity_loader (true)는 외부 엔티티가 비활성화되도록합니다. XML 파일에 외부 엔티티가 포함되어 있더라도 민감한 정보가 유출되거나 악의적 인 작업을 유발하지 않습니다.

5. 요약

외부 엔티티 공격 (XXE)은 부적절한 처리의 경우 심각한 보안 문제로 이어질 수있는 일반적이고 위험한 유형의 취약성입니다. 이러한 공격을 효과적으로 방지하기 위해 PHP는 Libxml_use_internal_errors ()libxml_disable_entity_loader () 의 두 가지 기능을 제공하여 개발자가 XML 구문 분석의 오류 출력을 제어하고 외부 엔티티로드를 비활성화하는 데 도움이 될 수 있습니다. 이 두 기능을 조합하여 사용함으로써 PHP 응용 프로그램의 보안을 크게 향상시킬 수 있으며 외부 엔티티의 공격을 피할 수 있습니다.