我刚刚开始在我在本地主机上运行的joomla开发网站的所有页面上出现间歇性错误。
完整的警告是:
Warning: simplexml_load_file(): I/O warning : failed to load external entity "/site/language/en-GB/en-GB.xml" in /site/libraries/joomla/language/language.php on line 1354
奇怪的是它是间歇性的,一些刷新通常可以解决这个问题。
是否存在可能导致此问题的代码问题,还是其他问题?
答案 0 :(得分:9)
让我把它放在这里以防万一有人会谷歌寻求答案,非线程安全 libxml_disable_entity_loader(false)
的解决方案将不适用。在系统范围内启用实体加载程序的潜在漏洞如下所示:
<!DOCTYPE scan [<!ENTITY test SYSTEM
"php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>
here解释了由于缺乏线程安全性而导致的问题。虽然可以使用libxml_set_external_entity_loader
注册她自己的实体加载器,或使用锁来保护对libxml_disable_entity_loader
的调用,但这些解决方案似乎有点令人费解。
好消息是外部实体的问题影响仅处理文件的功能(例如simplexml_load_file
,DOMDocument::schemaValidate
等) 。这使解决方案变得简单直接。首先将文件内容作为字符串加载,然后执行相应的libxml字符串导向函数。
simplexml_load_string(file_get_contents($xml));
和/或
$xml = new DOMDocument('1.0', 'UTF8');
$xml->loadXML(file_get_contents($xmlFile));
$xml->schemaValidateSource(file_get_contents($xsdFile));
希望它对某人有帮助。
答案 1 :(得分:5)
现在还没有确切地说这个解决方案有效,但它现在似乎已经解决了。
编辑:自从进行此更改后未发生任何重复,因此我可以确认这已解决了问题。
将libxml_disable_entity_loader(false);
添加到joomla的index.php
在Joomla论坛上,Cornel在他的帖子中感谢Corneliu: