In PHP kann man optionale Argumente an verschiedene XML-Parser übergeben, von denen einer LIBXML_NOENT
ist. Die documentation hat dies zu sagen:Was macht LIBXML_NOENT (und warum heißt es nicht LIBXML_ENT)?
LIBXML_NOENT (integer)
Ersatzeinheiten
Substitute entities
ist nicht sehr informativ (welche Einheiten wann sie ersetzt?). Aber ich denke, es ist fair anzunehmen, dass NOENT
ist kurz für NO_ENTITIES
oder , so scheint es eine faire Annahme zu sein, dass dieses Flag das Parsen von (externen) Entitäten deaktiviert.
Aber das ist in der Tat nicht der Fall:
$xml = '<!DOCTYPE root [<!ENTITY c PUBLIC "bar" "/etc/passwd">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT);
echo $dom->textContent;
Das Ergebnis ist, dass der Inhalt der Datei/etc/passwd Echo wird. Ohne das Argument LIBXML_NOENT
ist dies nicht der Fall.
Für nicht externe Entitäten scheint die Markierung keine Wirkung zu haben. Beispiel:
$xml = '<!DOCTYPE root [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->textContent;
Das Ergebnis dieses Codes ist "TEST", mit und ohne LIBXML_NOENT
.
Das Flag scheint keine Auswirkungen auf vordefinierte Entitäten wie <
zu haben.
Also meine Fragen sind:
- Was genau macht die
LIBXML_NOENT
Flagge tun? - Warum heißt es
LIBXML_NOENT
? Was ist es kurz und würde nichtLIBXML_ENT
oderLIBXML_PARSE_EXTERNAL_ENTITIES
eine bessere Passform sein? - Gibt es ein Flag, das das Parsen aller Entitäten verhindert?
Es [abgebildet] (https://github.com/php/php-src/blob/ef0279b640b19f6294a1429f9e04019b1f72d69c/ext/libxml/libxml.c#L801) die libxml konstant 'XML_PARSE_NOENT' wenn das gibt Ihnen nichts zu suchen auf. Es ist sehr vage beschrieben ... – miken32