Проверка XML против данного DTD в PHP

Это - жесткая проблема, и необходимо будет узнать эту информацию с помощью статического анализа, не доступный легко во времени выполнения. В основном получите путь к классу своего приложения и сканирования через доступные классы и считайте информацию о байт-коде класса, какому классу это наследовалось. Обратите внимание, что класс Собака не может непосредственно наследоваться Животному, но мог бы наследоваться Домашнему животному, которое является поворотом, наследовался Животному, таким образом, необходимо будет отслеживать ту иерархию.

10
задан Community 23 May 2017 в 12:24
поделиться

2 ответа

Примечание: XML-валидация может быть объектом атаки Billion Laughs и аналогичных DoS-векторов.

По сути, это то, что упоминается в rojoca его комментарий:

<?php

$xml = <<<END
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo SYSTEM "foo.dtd">
<foo>
    <bar>baz</bar>
</foo>
END;

$root = 'foo';

$old = new DOMDocument;
$old->loadXML($xml);

$creator = new DOMImplementation;
$doctype = $creator->createDocumentType($root, null, 'bar.dtd');
$new = $creator->createDocument(null, null, $doctype);
$new->encoding = "utf-8";

$oldNode = $old->getElementsByTagName($root)->item(0);
$newNode = $new->importNode($oldNode, true);
$new->appendChild($newNode);

$new->validate();

?>

Это позволит проверить документ на соответствие bar.dtd .

Вы не можете просто вызвать $ new-> loadXML () , потому что это просто установите DTD в исходное значение, а свойство doctype объекта DOMDocument доступно только для чтения, поэтому вам нужно скопировать корневой узел (со всем в нем) в новый документ DOM.

I только что сам попробовал это сделать, поэтому я не совсем уверен, все ли это покрывает, но это определенно работает для XML в моем примере.

Конечно, быстрое и грязное решение было бы сначала получить XML в виде строки,найдите и замените исходное DTD своим собственным, а затем загрузите его.

17
ответ дан 3 December 2019 в 20:43
поделиться

Я думаю, что это возможно только с XSD, см .:
http://php.net/manual/en/domdocument.schemavalidate#62032

1
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: