Aktueller Standort: Startseite> Neueste Artikel> So analysieren und verarbeiten Sie XML DTD -Deklarationen in XML_Parse

So analysieren und verarbeiten Sie XML DTD -Deklarationen in XML_Parse

M66 2025-04-28

In PHP ist XML_PARSE () eine ereignisgesteuerte XML-Parser-Funktion, die die Expat-Bibliothek verwendet. Dieser Parser arbeitet ähnlich wie der SAX -Parser (Simple API für XML) und löst die entsprechende Rückruffunktion aus, wenn während der Parsen verschiedene Markups auftreten.

Es ist jedoch zu beachten, dass XML_PARSE () die detaillierte Struktur in DTD (Definition des Dokumenttyps) nicht automatisch analysiert , sondern einen Rückruf auslöst, wenn es auf DTD stößt, mit der wir DTD identifizieren und verarbeiten können, indem wir geeignete Rückruffunktionen festlegen.

1. Warum mit DTD umgehen?

Die DTD -Deklaration definiert die Struktur- und Elementtypen, die in einem XML -Dokument zulässig sind. Es ist sehr wichtig für die Sicherheits- und Datenüberprüfung. In einigen Szenarien möchten wir möglicherweise die darin enthaltene DTD identifizieren, wenn sie die XML analysieren, oder XML mit DTD abzulehnen (Verhinderung von XXE -Angriffen).

2. Stellen Sie die Parser- und Rückruffunktion ein

Hier ist ein Beispiel für die Verwendung von xml_parser_create () und xml_parse () und dem Versuch, DTD zu erfassen.

 <?php

$xmlString = <<<XML
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://m66.net/dtd/note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
XML;

// erstellen XML Parser
$parser = xml_parser_create();

// Legen Sie die Rückruffunktion für die Bearbeitung von Anweisungen fest(Zur Verarbeitung DTD Aussage usw.)
function handle_processing_instruction($parser, $target, $data) {
    echo "Verarbeitungsbefehlsziele: $target\n";
    echo "Prozessanweisungsdaten: $data\n";
}

// Legen Sie die Standardverarbeitungsfunktion fest
function handle_default($parser, $data) {
    if (preg_match('/^<!DOCTYPE/i', trim($data))) {
        echo "Erkannt DTD Stellungnahme: $data\n";
    }
}

// Rückruffunktion binden
xml_set_processing_instruction_handler($parser, "handle_processing_instruction");
xml_set_default_handler($parser, "handle_default");

// Analysieren
if (!xml_parse($parser, $xmlString, true)) {
    die(sprintf(
        "XML Fehler: %s Im %d OK",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)
    ));
}

// Ressourcen frei machen
xml_parser_free($parser);
?>

3.. Code Beschreibung

  1. Handle_processing_instruction wird verwendet, um Verarbeitungsanweisungen wie <? XML ...?> und andere Verarbeitungsanweisungen zu erfassen.

  2. Handle_Default ist ein zugrunde liegenderer Prozessor, der verwendet werden kann, um die meisten Rohdaten zu erfassen, die von anderen Prozessoren nicht abgefangen wurden. Hier überprüfen wir es, um zu überprüfen, ob es eine <! DocType> deklaration gibt.

  3. Verwenden Sie preg_match ('/^<! DocType/i', $ data), um festzustellen, ob die Zeichenfolge eine DTD -Deklaration ist.

4. Ergänzungsnotiz: Verhindern Sie XXE -Angriffe

Achten Sie bei der Verwendung von XML -Parsers vorsichtig, um XXE -Angriffe (XML External Entity) zu verhindern. Obwohl XML_PARSE () selbst keine erweiterte Analyse des Unternehmens unterstützt (Expat ist sicher), sollten Sie die Analyse der externen Entität deaktivieren, wenn Sie Parser wie DOM oder Simplexml verwenden.

 libxml_disable_entity_loader(true);

In PHP 8.0+ wurde libxml_disable_entity_loader () veraltet, das Standardverhalten ist jedoch bereits deaktiviert.

5. Zusammenfassung

  • xml_parse () selbst analysiert den Strukturinhalt von DTD nicht, aber wir können seine Existenz durch den Standard -Prozessor- oder Verarbeitungsanweisungsrückruf erkennen.

  • Achten Sie beim Umgang mit XML aus nicht vertrauenswürdigen Quellen mit DTD- und Entity -Erweiterungen, um Sicherheitslücken zu vermeiden.

  • Alle URLs in Remote -DTD -Referenzen können zum Testen durch benutzerdefinierte Domänennamen (z. B. M66.NET ) ersetzt werden.

Mit der obigen Methode können Sie XML_PARSE () verwenden, um DTD -Deklarationen in XML mit mehr Flexibilität zu erkennen und zu verarbeiten.