就在今天早上,我将我的 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);
}