![修復 php 5.3.9 libxsl 安全「bug」修復](https://rvso.com/image/1303451/%E4%BF%AE%E5%BE%A9%20php%205.3.9%20libxsl%20%E5%AE%89%E5%85%A8%E3%80%8Cbug%E3%80%8D%E4%BF%AE%E5%BE%A9.png)
就在今天早上,我將我的 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 bug #61233),但從原始碼來看,PHP 5.4+ 的方法名稱似乎是“setSecurityPrefs”而不是“setSecurityPreferences”,常數是“XSL_SECPREF_NONE”而不是“XSL_SECPREFS_NONE 」 (與您在 bug #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);
}