间歇性simplexml_load_file():本地Joomla站点上的I/O警告

doo*_*ers 6 php joomla

我刚刚开始在我在localhost上运行的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

奇怪的是,它是间歇性的,一些刷新通常可以解决问题.

是否存在可能导致此问题的代码问题,还是其他问题?

Ale*_*kin 9

让我把它放在这里以防万一有人会谷歌寻求答案,而不是线程安全 的解决方案libxml_disable_entity_loader(false)将不适用.在系统范围内启用实体加载程序的潜在漏洞如下所示:

<!DOCTYPE scan [<!ENTITY test SYSTEM 
      "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>
Run Code Online (Sandbox Code Playgroud)

这里解释由缺乏线程安全性引起的问题.虽然可能要么注册她自己的实体加载器libxml_set_external_entity_loader,要么使用锁来保护呼叫libxml_disable_entity_loader,但这些解决方案似乎有点令人费解.

好消息是外部实体的问题影响处理文件的函数(例如simplexml_load_file,DOMDocument::schemaValidate等等).这使解决方案变得简单直接.首先将文件内容作为字符串加载,然后执行相应的libxml字符串导向功能.

simplexml_load_string(file_get_contents($xml));
Run Code Online (Sandbox Code Playgroud)

和/或

$xml = new DOMDocument('1.0', 'UTF8');
$xml->loadXML(file_get_contents($xmlFile));
$xml->schemaValidateSource(file_get_contents($xsdFile));
Run Code Online (Sandbox Code Playgroud)

希望它对某人有帮助.


doo*_*ers 5

现在还没有确切地说这个解决方案有效,但它似乎已经修复了它.

编辑:自从进行此更改后没有看到任何重复,所以我可以确认这已解决了问题.

添加libxml_disable_entity_loader(false);到joomla的index.php

感谢他在Joomla论坛上的Corneliu在这个帖子中的帖子:

J 1 3.1.6/3.2 simplexml_load_file,JForm :: getInstance错误