В PHP можно передать необязательные аргументы различным синтаксическим анализаторам XML, одним из которых является LIBXML_NOENT
. documentation это сказать об этом:Что делает LIBXML_NOENT (и почему он не называется LIBXML_ENT)?
LIBXML_NOENT (целое число)
Замену объекты
Substitute entities
не очень информативный (какие лица, когда они заменили??). Но я думаю, что справедливо предположить, что NOENT
является коротким для NO_ENTITIES
или NO_EXTERNAL_ENTITIES
, поэтому мне представляется справедливым предположение, что этот флаг отключает синтаксический анализ (внешних) объектов.
Но что на самом деле не случай:
$xml = '<!DOCTYPE root [<!ENTITY c PUBLIC "bar" "/etc/passwd">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT);
echo $dom->textContent;
Результатом является то, что содержание/и т.д./пароль вторит. Без аргумента LIBXML_NOENT
это не так.
Для не внешних объектов флаг, похоже, не имеет никакого эффекта. Пример:
$xml = '<!DOCTYPE root [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->textContent;
Результатом этого кода "TEST", с и без LIBXML_NOENT
.
Флаг, похоже, не влияет на предопределенные объекты, такие как <
.
Так что мои вопросы:
- Что именно делает
LIBXML_NOENT
флаг делать? - Почему это называется
LIBXML_NOENT
? Для чего это не так, и не будетLIBXML_ENT
илиLIBXML_PARSE_EXTERNAL_ENTITIES
лучше подойдет? - Есть ли флаг, который фактически предотвращает разбор всех объектов?
Это [сопоставляется с] (https://github.com/php/php-src/blob/ef0279b640b19f6294a1429f9e04019b1f72d69c/ext/libxml/libxml.c#L801) LibXML константа 'XML_PARSE_NOENT' если что дает вам что-нибудь сделать поиск на. Это очень смутно описано ... – miken32