UnRealName
@UnRealName

Что делать с preg replace на PHP?

Есть магазин на CMS Webasyst. Тестировал антивирус Virusdie, и пришло уведомление, что есть уязвимость.

bff1f1e16e4e43279462c8011570f6c3.png

Под подозрение попала строка:
$language_iso2 = preg_replace('/^([\w])/e',"strtoupper('\\1')",$language->iso2);


Весь фрагмент:
if(!$language_iso2){
			$language = LanguagesManager::getCurrentLanguage();
			/*@var $language Language*/
			if(in_array(strtolower($language->iso2),array('en','ru','nl','de','lv','es'))){
				$language_iso2 = preg_replace('/^([\w])/e',"strtoupper('\\1')",$language->iso2);
			}
		}


Подскажите, пожалуйста, как мне избавиться от этого так, чтобы сайт не сломался.

Файл находится по пути:
/published/SC/html/scripts/modules/payment/class.chronopay.php
  • Вопрос задан
  • 1235 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
Флаг "e" - считается deprecated, мол security проблемы могут быть.
Используйте preg_replace_callback.

$language_iso2 = preg_replace_callback(
    '/^([\w])/e',
    function($m) {
        return strtoupper($m[1]);
    },
    $language->iso2
);


// UPD

php.net/manual/ru/function.preg-replace.php
php.net/manual/ru/reference.pcre.pattern.modifiers...

Модификатор /e теперь считается устаревшим. Используйте функцию preg_replace_callback(). Смотрите документацию PREG_REPLACE_EVAL с дополнительной информацией и описанием проблем с безопасностью.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы