修復 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 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);
    }

相關內容