修复 php 5.3.9 libxsl 安全“bug”

修复 php 5.3.9 libxsl 安全“bug”

就在今天早上,我将我的 debian 服务器更新为 php5.3.9,变更日志(列表中的最后一项)已修复此问题漏洞现在,当使用 XSL 转换运行任何托管网站时,我得到:

Warning: XSLTProcessor::transformToXml(): Can't set libxslt security properties, not doing transformation for security reasons

<sax:output>我根本没有在我的 xslt 中使用任何标签。

有人有关于这方面的信息吗?目前关于这方面的讨论很少,所以我有点迷茫。

使用关于在 ->transformToXml() 两侧打开或关闭 ini 设置的建议:

ini_set("xsl.security_prefs", XSL_SECPREFS_NONE)

或者

$xsl->setSecurityPreferences(XSL_SECPREFS_NONE)

让我回到同样的错误

非常感谢。

进步:
- 尽管升级 libxml 并根据新版本重新编译 libxslt 是一个很好的建议,但并没有解决问题。
- 编译最新的 php5.3 快照并不能解决问题。

解决方案:
我不确定究竟是什么解决了这个问题,很抱歉其他人也遇到了同样的问题。首先我升级了 libxml,然后应用了一些补丁,然后进入 xsl 解析器的 php 源代码并添加了一些调试和一些调整,经过几次编译后,配置参数正确,错误就消失了,并且无法重现。
我绝对建议按照 Petr 在下面的建议升级 libxml,然后从 php.net 获取最新的快照。

答案1

尝试更新你的 libxml 扩展。(在我的案例中,2.7.7 -> 2.7.8 可能已经解决了这个问题)

答案2

我希望对此有更好的记录(请参阅 php 错误 #61233),但从源代码来看,PHP 5.4+ 的方法名称似乎是“setSecurityPrefs”而不是“setSecurityPreferences”,常量是“XSL_SECPREF_NONE”而不是“XSL_SECPREFS_NONE”(与您在错误 #54446 的注释中看到的相反)。不过,我宁愿使用 0,以防他们改变拼写主意。

现在我正在尝试类似的事情:

    if (version_compare(PHP_VERSION, '5.4', '<')) {
        $oldval = ini_get('xsl.security_prefs');
        if ($oldval != '0') {
            $oldval = ini_set('xsl.security_prefs', '0');
            if ($oldval === false)
                ;//manage the error
        }
    } else
        $oldval = $xsltproc->setSecurityPrefs(0);

变换后:

    if ($oldval != 0 && $oldval != '0') {
        if (version_compare(PHP_VERSION, '5.4', '<'))
            ini_set('xsl.security_prefs', $oldval);
        else
            $xsltproc->setSecurityPrefs($oldval);
    }

相关内容