PHP verilen DTD karşı XML doğrulama

1 Cevap php

Değil dışarıdan getirilen XML belge ile - PHP, benim uygulama tarafından belirtilen bir DTD kullanarak bir XML belgesini doğrulamak çalışıyorum. DOMDocument sınıfında Doğrulama yöntemi sadece XML belgenin kendisi tarafından belirtilen DTD kullanarak doğrular gibi görünüyor, bu yüzden bu iş olmaz.

Bu yapıldığında, ve nasıl, ya da ben schemaValidate yöntemini kullanabilirsiniz böylece bir XML şeması benim DTD çevirmek gerekiyor olabilir?

(Çözüm yalnızca hedef XML tarafından speicified DTD'den dayandığından bu, http://stackoverflow.com/questions/101935/validate-xml-using-a-custom-dtd-in-php ama doğru cevap sorulmadan edilmiş görünüyor)

1 Cevap

Not: XML validation Billion Laughs saldırı, ve benzeri DoS vektörleri tabi olabilir.

Bu aslında yaptığı açıklamada belirtilen rojoca yapar:

<?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();

?>

Bu bar.dtd karşı belgeyi doğrulamak olacaktır.

Sadece orijinal DTD açardı ve bir DOMDocument nesnenin doctype özelliği salt okunur olduğu için kopyalamak zorunda böylece sadece, $new->loadXML() diyemezsin Yeni DOM belgesi (içinde her şeyi ile) kök düğüm.

Ben sadece bu bir GİTMEK kendimi vardı, bu yüzden bu her şeyi kapsar tamamen emin değilim, ama kesinlikle benim örnekte XML için çalışıyor.

Tabii ki, kirli hızlı ve çözüm birinci, bir dizge olarak XML almak arama ve kendi DTD tarafından orijinal DTD değiştirin ve sonra yüklemek olacaktır.