![Исправление ошибки безопасности libxsl в PHP 5.3.9](https://rvso.com/image/1303451/%D0%98%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20libxsl%20%D0%B2%20PHP%205.3.9.png)
только сегодня утром я обновил свой сервер Debian до PHP5.3.9, в журнале изменений (последний пункт в списке) есть исправление для этогоошибкаи теперь при запуске любого размещенного сайта с использованием XSL-преобразований я получаю:
Warning: XSLTProcessor::transformToXml(): Can't set libxslt security properties, not doing transformation for security reasons
Я <sax:output>
вообще не использую никаких тегов в своем xslt.
Есть ли у кого-нибудь информация по этому поводу? В настоящее время об этом мало что известно, поэтому я немного запутался.
Используя предложение о включении и выключении настроек ini по обе стороны от ->transformToXml():
ini_set("xsl.security_prefs", XSL_SECPREFS_NONE)
или
$xsl->setSecurityPreferences(XSL_SECPREFS_NONE)
возвращает меня к той же ошибке
Большое спасибо.
Прогресс:
- Обновление libxml и перекомпиляция libxslt для новой версии были хорошим предложением, хотя и не решили проблему.
- Компиляция последней версии php5.3 не решила проблему.
Решение:
Я не уверен, что на самом деле решило эту проблему, очень жаль, если у кого-то еще возникнет такая же проблема. Сначала я обновил libxml, затем применил несколько патчей, затем перешел к исходному коду php для парсера xsl и добавил немного отладки и несколько настроек, после нескольких компиляций с правильными аргументами конфигурации ошибка исчезла и больше не воспроизводилась.
Я бы определенно рекомендовал обновить 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);
}