Preg replace у вирус
Здравствуйте! Случилась бяка - заражены все сайты (Joomla 1.5 + виртуемарт) на хостинге. Причина точно неизвестна, но скорее всего это отголоски серии прежних заражений месяц назад.
Сначала в index.php был внедрен код eval(base64_decode('aGVhZGVyK. ')); . Код был удален. Был сменен пароль на ftp. Больше ничего не проводилось.
Затем, через несколько дней, через JCE был залит файл COPYRIGHT.php с вредоносным кодом. Файл был удален, редактор JCE на всех сайтах снесли.
Сейчас, на всех сайтах заразились js файлы. В каждом файле, в конце кода прописана строка: ;document.write(unescape("%3C%73%63%72%69%70%74%. "));
Антивирусники обнаружили такую заразу на всех сайтах:
При сохранении бэкапов на компе и сканировании, Касперский находит строчки JS.Redirector.189 в js-файлах и удаляет ее. Больше ничего не показывает. Хотя, при онлайн проверке указывает на Trojan-Downloader.JS.JScript.cb
Все зараженные js-файлы изменены в один день, в прошлом месяце. Логи за этот период не сохранились ((
Подскажите, пожалуйста, где искать заразу, которая все это заливает?
Допустим, строчку зловредного кода я удалю через эти скрипты - (http://joomlaforum.ru/index.php/topic,198048.0.html) или (http://secu.ru/scripts/find-and-replace) или Касперским. А где искать сам Shell?
Папки tmp всех сайтов пустые. Файлы index.php вроде чистые.
Помогите, плз!
- Живу я здесь 4660 315 / 7
- Ищу работу
в файле mod_articles.php
Это шел или нужный код?
- Давно я тут 809 51 / 2
- Свободен для работы
На одном из сайтов на хостинге, в разделе /images/stories/ обнаружил файл dkml.php с текстом:
"iskorpitx " Это и есть Шелл?
В папку images также добавлен файл .htaccess с текстом:
А в файл .htaccess сайта добавлены строчки:
order deny,allow
#allow from 46.33.226.192
#deny from all
Здравствуйте! Случилась бяка - заражены все сайты (Joomla 1.5 + виртуемарт) на хостинге. Причина точно неизвестна, но скорее всего это отголоски серии прежних заражений месяц назад.
Все зараженные js-файлы изменены в один день, в прошлом месяце. Логи за этот период не сохранились ((
Логи Joomla или FTP-Логи хостера?
У хостера должны оставаться FTP-логи всех ip-адресов, которые имели подключение и изменение/запись файлов.
Уточни и хостера и пиши абузу провайдеру данного IP. Для европейских провайдеров может возыметь действие.
ну и прикрой сайты от данного IPшника.
"iskorpitx " Это и есть Шелл?
пробовал проверять все файлы Joomla на изменение? при помощи сверки по MD5.
А для Joomla 2.5.9 есть что-нибудь похожее?
Привет! Мучаюсь с периодически возникающей заразой, похожей на вышеописанные случаи. Наковырял в папке com_userprofiles\ интересные файлики:get.php , userprofiles.php
Содержимое первого такое:
- Живу я здесь 4660 315 / 7
- Ищу работу
Второй кусок кода с preg_replace(. ) 100% бэкдор, а не файл Joomla.
Решил поковыряться в логах доступа к сайту. И вот что интересного там отыскал (это, как я понимаю, меня так ломают?)..
Часть вторая (тут похоже подбирают пароли??)
dormidont абсолютно точно. Какие дальнейшие планы к действиям?
Это всё может возыметь 4 результата: )))
1) Ничего не произодёт
2) провайдер сделает "Ата-та" атакующему и тот перестанет это делать
3) атакующий может съехать к другому провайдеру
4) атакующий не хакер, а жертва и заражён трояном, и его ПК нуждается в лечении его полечат.
В сети станет чуток чище и "легче дышать" ))
dormidont абсолютно точно. Какие дальнейшие планы к действиям?
PunBB.INFO → Bug reports → Ошибка PHP Deprecated: preg_replace(): The /e modifier is deprecated
You must login or register to post a reply
Posts: 11
- YT007
- Member
- Offline
- More info
- PunBB
- Admin
- Offline
- More info
- YT007
- Member
- Offline
- More info
- PunBB
- Admin
- Offline
- More info
- YT007
- Member
- Offline
- More info
- PunBB
- Admin
- Offline
- More info
- YT007
- Member
- Offline
- More info
- YT007
- Member
- Offline
- More info
- Xakker
- Member
- Offline
- More info
- YT007
- Member
- Offline
- More info
- Use of preg_replace_callback is instead of the /e modifier on the regex, so you need to remove that flag from your "pattern" argument. So a pattern like /blah(.*)blah/mei would become /blah(.*)blah/mi .
- The /e modifier used a variant of addslashes() internally on the arguments, so some replacements used stripslashes() to remove it; in most cases, you probably want to remove the call to stripslashes from your new callback.
- Really just tested with a few samples from Stack Overflow.
- Does only support the easy cases (function calls, not variable lookups).
- Contains a few more restrictions and advisory notices.
- Will yield dislocated and less comprehensible errors for expression failures.
- However is still a usable temporary solution and doesn't complicate a proper transition to preg_replace_callback .
- And the license comment is just meant to deter people from overusing or spreading this too far.
- Specificially the $OUTPUT = assignment would have to go if the previous preg_replace call was used in an if .
- It's best to keep temporary variables or the multiline code block structure though.
- For instance stripslashes() often becomes redundant in literal expressions.
- Variable-scope lookups require a use or global reference for/within the callback.
- Unevenly quote-enclosed "-$1-$2" capture references will end up syntactically broken by the plain transformation into "-$m[1]-$m[2] .
- "Регулярные выражения PCRE"
- preg_quote() - Экранирует символы в регулярных выражениях
- preg_filter() - Производит поиск и замену по регулярному выражению
- preg_match() - Выполняет проверку на соответствие регулярному выражению
- preg_replace_callback() - Выполняет поиск по регулярному выражению и замену с использованием callback-функции
- preg_split() - Разбивает строку по регулярному выражению
- preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
- Использование preg_replace_callback вместо модификатора /e в регулярном выражении, поэтому вам нужно удалить этот флаг из аргумента "шаблон". Таким образом, шаблон, подобный /blah(.*)blah/mei , станет /blah(.*)blah/mi .
- Модификатор /e использовал аргумент addslashes() внутри аргументов, поэтому для некоторых замен использовались stripslashes() для его удаления; в большинстве случаев вы, вероятно, хотите удалить вызов stripslashes из вашего нового обратного вызова.
- Действительно только что протестировано с несколькими образцами из Кару.
- Поддерживает только простые случаи (вызовы функций, а не поиск переменных).
- Содержит несколько дополнительных ограничений и уведомлений.
- Приводит к смещенным и менее понятным ошибкам при выражении ошибок.
- Тем не менее, это временное решение, которое можно использовать, и оно не затрудняет надлежащий переход на preg_replace_callback .
- А лицензионный комментарий предназначен только для того, чтобы удержать людей от чрезмерного использования или распространения этого слишком далеко.
- В частности, назначение $OUTPUT = должно было бы выполняться, если предыдущий вызов preg_replace использовался в if .
- Лучше всего сохранить временные переменные или структуру многострочного кода.
- Например, stripslashes() часто становится избыточным в литеральных выражениях.
- Для поиска в переменной области требуется ссылка use или global для/в обратном вызове.
- Неравномерно заключенные в кавычки ссылки "-$1-$2" будут синтаксически разбиты простым преобразованием в "-$m[1]-$m[2] .
- Хронический вирусный гепатит с клиника диагностика лечение
- Отчет о проделанной работе по профилактике бешенства
- Можно ли принимать противовирусные препараты с антигистаминными
- Что такое вялотекущий грипп
- Согласие на прививку от гриппа в детском саду
Вылезла ошибка после перехода на PunBB 1.4.3
PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/f/366_281/***.com/public_html/forum/include/parser.php on line 807
Почитав немного инфы, я пришел к выводу, что нужно заменить старую функцию на новую. Достаточно просто заменить функцию или же нужно всю регулярку целиком переписывать? Кто вкурсе?
YT007, либо обновлять до 1_4_4 либо откатить версию php. Вроде она должна быть не выше 5.5. Напишите тикет вашему хостеру, мол какая версия еще поддерживает эту функцию
Модификатор /e теперь считается устаревшим. Используйте функцию preg_replace_callback(). Смотрите документацию PREG_REPLACE_EVAL с дополнительной информацией и описанием проблем с безопасностью.
Обновил до 1.4.4 версии, теперь сообщения куда то пропали! Как такое может быть?
Обновил до 1.4.4 версии, теперь сообщения куда то пропали! Как такое может быть?
видимо какое либо расширение все еще использует модификатор и не адаптировано под 1_4_4. Отключайте по очереди, как только текст появится, значит его мусолить и нужно.
Откройте
manifest.xml
найти хук
ps_do_bbcode_replace
Заменить
Еще одна выявилась ошибка. Вот такая:
PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/f/366_281/***.com/public_html/forum/include/parser.php(748) : eval()'d code on line 22
уже ругается на 748 строку parser.php
Еще одна выявилась ошибка. Вот такая:
PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/f/366_281/***.com/public_html/forum/include/parser.php(748) : eval()'d code on line 22
уже ругается на 748 строку parser.php
748 это хук :
$return = ($hook = get_hook('ps_do_bbcode_start')) ? eval($hook) : null;
Ищи по базе, по таблице хуков что на нем сидит
Нашел! Вот оно:
Spoiler BBcode • Версия 0.8 • Разработчик: [email protected]
а вот строка с модификатором:
есть ли решение поменять на рабочий вариант?
I'm terrible with regular expressions. I'm trying to replace this:
with preg_replace_callback with an anonymous function. I don't understand what the \\2 is doing. Or for that matter exactly how preg_replace_callback works.
What would be the correct code for achieving this?
3 Answers 3
In a regular expression, you can "capture" parts of the matched string with (brackets) ; in this case, you are capturing the (^|_) and ([a-z]) parts of the match. These are numbered starting at 1, so you have back-references 1 and 2. Match 0 is the whole matched string.
The /e modifier takes a replacement string, and substitutes backslash followed by a number (e.g. \1 ) with the appropriate back-reference - but because you're inside a string, you need to escape the backslash, so you get '\\1' . It then (effectively) runs eval to run the resulting string as though it was PHP code (which is why it's being deprecated, because it's easy to use eval in an insecure way).
The preg_replace_callback function instead takes a callback function and passes it an array containing the matched back-references. So where you would have written '\\1' , you instead access element 1 of that parameter - e.g. if you have an anonymous function of the form function($matches) < . >, the first back-reference is $matches[1] inside that function.
So a /e argument of
could become a callback of
Or in your case
Note that $m and $matches are not magic names, they're just the parameter name I gave when declaring my callback functions. Also, you don't have to pass an anonymous function, it could be a function name as a string, or something of the form array($object, $method) , as with any callback in PHP, e.g.
As with any function, you can't access variables outside your callback (from the surrounding scope) by default. When using an anonymous function, you can use the use keyword to import the variables you need to access, as discussed in the PHP manual. e.g. if the old argument was
then the new callback might look like
This is very inadvisable. But if you're not a programmer, or really prefer terrible code, you could use a substitute preg_replace function to keep your /e flag working temporarily.
In essence, you just include that function in your codebase, and edit preg_replace to preg_replace_eval wherever the /e flag was used.
Pros and cons:
Now this is somewhat redundant. But might help those users who are still overwhelmed with manually restructuring their code to preg_replace_callback . While this is effectively more time consuming, a code generator has less trouble to expand the /e replacement string into an expression. It's a very unremarkable conversion, but likely suffices for the most prevalent examples.
To use this function, edit any broken preg_replace call into preg_replace_eval_replacement and run it once. This will print out the according preg_replace_callback block to be used in its place.
Take in mind that mere copy&pasting is not programming. You'll have to adapt the generated code back to your actual input/output variable names, or usage context.
And the replacement expression may demand more readability improvements or rework.
The code output is merely a starting point. And yes, this would have been more useful as an online tool. This code rewriting approach (edit, run, edit, edit) is somewhat impractical. Yet could be more approachable to those who are accustomed to task-centric coding (more steps, more uncoveries). So this alternative might curb a few more duplicate questions.
(PHP 4, PHP 5, PHP 7)
preg_replace — Выполняет поиск и замену по регулярному выражению
Выполняет поиск совпадений в строке subject с шаблоном pattern и заменяет их на replacement .
Искомый шаблон. Может быть как строкой, так и массивом строк.
Также доступны некоторые модификаторы PCRE, включая устаревший 'e' (PREG_REPLACE_EVAL), специфичный только для этой функции.
Строка или массив строк для замены. Если этот параметр является строкой, а pattern является массивом, все шаблоны будут заменены этой строкой. Если и pattern и replacement являются массивами, каждый элемент pattern будет заменен соответствующим элементом из replacement . Если массив replacement содержит меньше элементов, чем массив pattern , то все лишние шаблоны из pattern будут заменены пустыми строками.
replacement может содержать ссылки вида \\ n , либо (начиная с PHP 4.0.4) $ n , причем последний вариант предпочтительней. Каждая такая ссылка будет заменена на подстроку, соответствующую n -ой подмаске. n может принимать значения от 0 до 99, причем ссылка \\0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы. Для использования обратного слеша, его необходимо продублировать (строка PHP "\\\\").
При замене по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра (например, установка цифры сразу после совпавшей маски). В таком случае нельзя использовать знакомую нотацию вида \\1 для ссылки на подмаски. Запись, например, \\11, смутит preg_replace() , так как она не сможет понять, хотите ли вы использовать ссылку \\1, за которой следует цифра 1 или же вы хотите просто использовать ссылку \\11, за которой ничего не следует. Это недоразумение можно устранить, если воспользоваться конструкцией \$<1>1, использующей изолированную ссылку $1, и следующую за ней цифру 1.
При использовании устаревшего модификатора e эта функция экранирует некоторые символы (а именно ', ", \ и NULL) в строках, замещающих обратные ссылки. Это сделано для удостоверения корректности синтаксиса при использовании обратных ссылок внутри одинарных или двойных кавычек (например, 'strlen(\'$1\')+strlen("$2")'). Убедитесь, что вы владеете синтаксисом обработки строк PHP для того, чтобы точно осознавать, как будет выглядеть интерпретированная строка.
Строка или массив строк для поиска и замены.
Если subject является массивом, то поиск с заменой осуществляется для каждого элемента массива subject , а возвращаемое значение также будет являться массивом.
Максимально возможное количество замен каждого шаблона для каждой строки subject . По умолчанию равно -1 (без ограничений).
Если указана, то эта переменная будет заполнена количеством произведенных замен.
preg_replace() возвращает массив, если параметр subject является массивом, иначе возвращается строка.
Если найдены совпадения, возвращается новая версия subject , иначе subject возвращается нетронутым, в случае ошибки возвращается NULL .
При использовании устаревшего модификатора "\e" бросается ошибка уровня E_DEPRECATED .
Версия | Описание |
---|---|
5.5.0 | Модификатор /e теперь считается устаревшим. Используйте функцию preg_replace_callback() . Смотрите документацию PREG_REPLACE_EVAL с дополнительной информацией и описанием проблем с безопасностью. |
5.1.0 | Добавлен параметр count |
Пример #1 Использование подмасок, за которыми следует цифра
Результат выполнения данного примера:
Пример #2 Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()
Результат выполнения данного примера:
Отсортировав по ключам шаблоны и замены, получаем желаемый результат:
Результат выполнения данного примера:
Пример #3 Замена по нескольким шаблонам
Результат выполнения данного примера:
Пример #4 Чистка пробелов
Этот пример вычищает лишние пробелы в строке.
Пример #5 Использование параметра count
echo preg_replace (array( '/\d/' , '/\s/' ), '*' , 'xp 4 to' , - 1 , $count );
echo $count ; //3
?>
Результат выполнения данного примера:
При использовании массивов в pattern и replacement , ключи обрабатываются в том порядке, в котором они находятся в массиве. Этот порядок не всегда совпадает с числовым порядком индексов. Если вы используете индексы для сопоставления друг с другом нужного pattern и replacement , то вам необходимо прогнать через функцию ksort() оба массива перед использованием preg_replace() .
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace -- Выполняет поиск и замену по регулярному выражению
Описание mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement . В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.
Replacement может содержать ссылки вида \\ n либо (начиная с PHP 4.0.4) $n , причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую n 'нной заключенной в круглые скобки подмаске. n может принимать значения от 0 до 99, причем ссылка \\0 (либо $0 ) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.
При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \\n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \\11 , что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией \$<1>1 , указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1 .
Пример 1. Использование подмасок, за которыми следует цифра
= "April 15, 2003" ; $pattern = "/(\w+) (\d+), (\d+)/i" ; $replacement = "\$<1>1,\$3" ; echo preg_replace ( $pattern , $replacement , $string ); ?> |
Результатом работы этого примера будет:
Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение subject , в противном случае будет возвращен исходный текст subject .
Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.
Пример 2. Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()
= "The quick brown fox jumped over the lazy dog." ;
$patterns [ 0 ] = "/quick/" ; $replacements [ 2 ] = "bear" ; echo preg_replace ( $patterns , $replacements , $string ); |
The bear black slow jumped over the lazy dog.
( $patterns ); ksort ( $replacements ); echo preg_replace ( $patterns , $replacements , $string ); The slow black bear jumped over the lazy dog. В случае, если параметр subject является массивом, поиск и замена по шаблону производятся для каждого из его элементов. Возвращаемый результат также будет массивом. В случае, если параметры pattern и replacement являются массивами, preg_replace() поочередно извлекает из обоих массивов по паре элементов и использует их для операции поиска и замены. Если массив replacement содержит больше элементов, чем pattern , вместо недостающих элементов для замены будут взяты пустые строки. В случае, если pattern является массивом, а replacement - строкой, по каждому элементу массива pattern будет осущесвтлен поиск и замена на pattern (шаблоном будут поочередно все элементы массива, в то время как строка замены остается фиксированной). Вариант, когда pattern является строкой, а replacement - массивом, не имеет смысла. Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace() , возникнет ошибка синтаксиса. Пример 3. Замена по нескольким шаблонам
Этот пример выведет: Пример 4. Использование модификатора /e
Преобразует все HTML-теги к верхнему регистру Пример 5. Конвертор HTML в текст
Я ужасен с регулярными выражениями. Я пытаюсь заменить это: с preg_replace_callback с анонимной функцией. Я не понимаю, что делает \\2. Или, в точности, как работает preg_replace_callback. Каким будет правильный код для достижения этого? В регулярном выражении вы можете "захватить" части согласованной строки (brackets) ; в этом случае вы захватываете (^|_) и ([az]) части матча. Они нумеруются начиная с 1, так что у вас есть обратные ссылки 1 и 2. Матч 0 - вся строка со строкой. Модификатор /e принимает заменяющую строку и заменяет обратную косую черту с последующим номером (например, \1 ) с соответствующей обратной ссылкой - но поскольку вы внутри строки, вам нужно избежать обратного слэша, так что вы получите '\\1' . Затем он (эффективно) запускает eval для запуска результирующей строки, как если бы это был PHP-код (поэтому он устарел, поскольку он легко использует eval небезопасным способом). Функция preg_replace_callback вместо этого выполняет функцию обратного вызова и передает ей массив, содержащий согласованные обратные ссылки. Итак, где бы вы написали '\\1' , вы вместо этого обращаетесь к элементу 1 этого параметра - например, если у вас есть анонимная функция функции формы function($matches) <. >, первая обратная ссылка - $matches[1] внутри этой функции. Итак, аргумент a /e может стать обратным вызовом Или в вашем случае Обратите внимание, что $matches $m и $matches не являются волшебными именами, это просто имя параметра, которое я дал при объявлении моих функций обратного вызова. Кроме того, вам не нужно передавать анонимную функцию, это может быть имя функции как строка или что-то вроде array($object, $method) формы array($object, $method) , как и любой обратный вызов в PHP, например Как и для любой функции, вы не можете получить доступ к переменным за пределами своего обратного вызова (из окружения) по умолчанию. При использовании анонимной функции вы можете использовать ключевое слово use для импорта переменных, которые вам нужны для доступа, как описано в руководстве по PHP. например, если старый аргумент был то новый обратный вызов может выглядеть так: Вы не должны использовать флаг e (или eval в целом). Вы также можете использовать библиотеку T-Regx Это очень нежелательно. Но если вы не программист или действительно предпочитаете ужасный код, вы можете использовать замещающую функцию preg_replace , чтобы ваш флаг /e временно работал. По сути, вы просто включаете эту функцию в свою кодовую базу и редактируете preg_replace в preg_replace_eval везде, где использовался флаг /e . Плюсы и минусы: Теперь это несколько избыточно. Но может помочь тем пользователям, которые все еще перегружены вручную изменить их код на preg_replace_callback . Хотя это эффективно отнимает больше времени, у генератора кода меньше проблем с развертыванием строки замены /e в выражение. Это очень ничем не примечательное преобразование, но, вероятно, достаточно для наиболее распространенных примеров. Чтобы использовать эту функцию, отредактируйте любой прерванный вызов preg_replace в preg_replace_eval_replacement и выполните его один раз. Это распечатает соответствующий блок preg_replace_callback , который будет использоваться вместо него. Помните, что простое копирование и вставка - это не программирование. Вам придется адаптировать сгенерированный код обратно к вашим реальным именам входных/выходных переменных или контексту использования. И выражение замены может потребовать большего улучшения читаемости или переделки. Вывод кода является лишь отправной точкой. И да, это было бы более полезным в качестве онлайн-инструмента. Такой подход к переписыванию кода (редактировать, запускать, редактировать, редактировать) несколько непрактичен. Тем не менее может быть более доступным для тех, кто привык к задачно-ориентированному кодированию (больше шагов, больше открытий). Так что эта альтернатива может обуздать еще несколько повторяющихся вопросов. Читайте также: |