From: vl dot homutov at gmail dot com
Operating system: Linux
PHP version: 5.4.7
Package: *XML functions
Bug Type: Bug
Bug description:External DTDs are not processed
Description:
------------
PHP's xml_parse() ignores external DTD specified in the
XML file and thus can't parse the file if it has
unknown entities (defined in the DTD mentioned).
Test script:
---------------
#!/usr/bin/php
<?php
$xml_ext_dtd=<<<EOXML
<?xml version="1.0"?>
<!DOCTYPE mytag SYSTEM "./mytag.dtd">
<mytag><elem>one</elem><elem>two</elem><elem>&custom;</elem>/mytag>
EOXML;
$xml_int_dtd=<<<EOXML
<?xml version="1.0"?>
<!DOCTYPE mytag
[
<!ENTITY custom SYSTEM "file.txt">
]>
<mytag><elem>one</elem><elem>two</elem><elem>&custom;</elem>/mytag>
EOXML;
function externalEntityHandler($parser, $name, $base, $systemId,
$publicId)
{
echo "PROCESS EXTERNAL REFERENCE(file=$systemId)\n";
return true;
}
function characterDataHandler($parser, $data)
{
echo "CDATA found: '$data'\n";
}
function xerr($parser)
{
$out = "XML parser error:";
$out.=xml_error_string(xml_get_error_code($parser));
$out.="\n";
return $out;
}
echo "This works OK - parse xml1:\n$xml_int_dtd\n";
echo "---------------------------------------\n";
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "characterDataHandler");
xml_set_external_entity_ref_handler($xml_parser, "externalEntityHandler");
xml_parse($xml_parser, $xml_int_dtd) or die(xerr($xml_parser));
echo "\nThis FAILS - parse xml2:\n$xml_ext_dtd\n";
echo "---------------------------------------\n";
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "characterDataHandler");
xml_set_external_entity_ref_handler($xml_parser, "externalEntityHandler");
$rv = xml_parse($xml_parser, $xml_ext_dtd);
if (!$rv) echo xerr($xml_parser);
echo "file 'mytag.dtd' is:\n".file_get_contents("./mytag.dtd");
?>
Expected result:
----------------
This works OK - parse xml1:
<?xml version="1.0"?>
<!DOCTYPE mytag
[
<!ENTITY custom SYSTEM "file.txt">
]>
<mytag><elem>one</elem><elem>two</elem><elem>&custom;</elem>/mytag>
---------------------------------------
CDATA found: 'one'
CDATA found: 'two'
PROCESS EXTERNAL REFERENCE(file=file.txt)
Actual result:
--------------
This FAILS - parse xml2:
<?xml version="1.0"?>
<!DOCTYPE mytag SYSTEM "./mytag.dtd">
<mytag><elem>one</elem><elem>two</elem><elem>&custom;</elem>/mytag>
---------------------------------------
CDATA found: 'one'
CDATA found: 'two'
XML parser error:Undeclared entity warning
file 'mytag.dtd' is:
<!ENTITY custom SYSTEM "file.txt">
--
Edit bug report at https://bugs.php.net/bug.php?id=63189&edit=1
--
Try a snapshot (PHP 5.4):
https://bugs.php.net/fix.php?id=63189&r=trysnapshot54
Try a snapshot (PHP 5.3):
https://bugs.php.net/fix.php?id=63189&r=trysnapshot53
Try a snapshot (trunk):
https://bugs.php.net/fix.php?id=63189&r=trysnapshottrunk
Fixed in SVN: https://bugs.php.net/fix.php?id=63189&r=fixed
Fixed in release: https://bugs.php.net/fix.php?id=63189&r=alreadyfixed
Need backtrace: https://bugs.php.net/fix.php?id=63189&r=needtrace
Need Reproduce Script: https://bugs.php.net/fix.php?id=63189&r=needscript
Try newer version: https://bugs.php.net/fix.php?id=63189&r=oldversion
Not developer issue: https://bugs.php.net/fix.php?id=63189&r=support
Expected behavior: https://bugs.php.net/fix.php?id=63189&r=notwrong
Not enough info:
https://bugs.php.net/fix.php?id=63189&r=notenoughinfo
Submitted twice:
https://bugs.php.net/fix.php?id=63189&r=submittedtwice
register_globals: https://bugs.php.net/fix.php?id=63189&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=63189&r=php4
Daylight Savings: https://bugs.php.net/fix.php?id=63189&r=dst
IIS Stability: https://bugs.php.net/fix.php?id=63189&r=isapi
Install GNU Sed: https://bugs.php.net/fix.php?id=63189&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=63189&r=float
No Zend Extensions: https://bugs.php.net/fix.php?id=63189&r=nozend
MySQL Configuration Error: https://bugs.php.net/fix.php?id=63189&r=mysqlcfg