在 PHP 8.0 及更高版本中,PHP 使用 libxml 2.9.0 及更高版本,libxml_disable_entity_loader 已被弃用。
因此,现在可以在 php8 上安全地删除所有 `libxml_disable_entity_loader` 调用。
如果您想要向后兼容性
使用此代码段
if (\PHP_VERSION_ID < 80000) {
libxml_disable_entity_loader(true);
}
(PHP 5 >= 5.2.11, PHP 7, PHP 8)
libxml_disable_entity_loader — 禁用加载外部实体的能力
此函数已在 PHP 8.0.0 中被 弃用。强烈建议不要依赖此函数。
禁用/启用加载外部实体的能力。请注意,禁用加载外部实体可能会导致加载 XML 文档时出现一般问题。但是,从 libxml 2.9.0 开始,实体替换默认情况下是禁用的,因此无需禁用加载外部实体,除非需要使用 LIBXML_NOENT
解析内部实体引用。通常,最好使用 libxml_set_external_entity_loader() 来抑制加载外部实体。
返回上一个值。
LIBXML_NOENT
常量在 PHP 8.0 及更高版本中,PHP 使用 libxml 2.9.0 及更高版本,libxml_disable_entity_loader 已被弃用。
因此,现在可以在 php8 上安全地删除所有 `libxml_disable_entity_loader` 调用。
如果您想要向后兼容性
使用此代码段
if (\PHP_VERSION_ID < 80000) {
libxml_disable_entity_loader(true);
}
如果调用
libxml_disable_entity_loader(true);
,会导致新的 SoapClient(.) 失败,并出现以下错误:
SOAP-ERROR: Parsing WSDL: Couldn't load from 'D:\path/dm_operations.wsdl' : failed to load external entity "D:\path/dm_operations.wsdl
因为此 wsdl 将 xsd 作为另一个外部文件导入。
在 php 7.1.12、win x64 上测试。
suconghou 2 年前发布的代码中,PHP_VERSION_ID 前面多了一个反斜杠,应该删除。
if (PHP_VERSION_ID < 80000) {
libxml_disable_entity_loader(true);
}
请注意,这还会禁用 simplexml_load_file() 中的 url 加载,以及可能其他处理 url 的基于 libxml 的函数。
使用此函数,您可以防止易受本地和远程文件包含攻击的攻击。
您将在以下示例中看到它,我将加载并验证以下字符串
<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>
防止返回文件的一种方法是将此值设置为 0。
请仔细查看 symfony 2.0.11 的发布。