Edit report at https://bugs.php.net/bug.php?id=63189&edit=1
ID: 63189 Comment by: vl dot homutov at gmail dot com Reported by: vl dot homutov at gmail dot com Summary: External DTDs are not processed Status: Open Type: Bug Package: *XML functions Operating System: Linux PHP Version: 5.4.7 Block user comment: N Private report: N New Comment: Additional details: There is also problem if custom entity is present in the attribute: <?xml version="1.0"?> <!DOCTYPE mytag [<!ENTITY custom SYSTEM "file.txt">]> <mytag attr="&custom;"><elem>one</elem><elem>two</elem><elem>&custom;</elem></mytag> gives: XML parser error:XML_ERR_ENTITY_IS_EXTERNAL Previous Comments: ------------------------------------------------------------------------ [2012-09-29 19:56:04] vl dot homutov at gmail dot com 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 this bug report at https://bugs.php.net/bug.php?id=63189&edit=1