Антивирус на коленке или вирусы на сайте
06.05.2014 00:29
Итак, штатная ситуация — на сайте завелись вирусы. Если Яндекс и Гугл это ещё не заметили — ваше счастье.
Перво-наперво — посмотрите какие файлы менялись последними. Типовой пример: яваскриптовая зараза, как правило ради сливания траффика.
Если вы обнаружили в коде конструкции вида:
document.write('') /* внутри какое-то говно непонятного назначения, но не счётчик и не ваш код */
или
то большой повод задуматься. JavaScript`ы как правило заражают самый конец файла, очень редко после открывающимся body. Визуально заметно, что какая-то километровая строка непонятного назначения. Кроме того, что вытянуто в одну строку без переносов, часто попадается eval или декодирование какого-нибудь хэша.
Если инфицирована пара файлов — можно поприбивать руками. Если счёт идёт на сотни и тысячи, то проблему надо решать как-то пакетно. И тут пара вариантов:
- выкачивать сайт и менять каким-нибудь редактором типа Dreamweaver, NetBeans или Notepad++ (любым, умеющим искать и заменять по множеству файлов)
- или использовать специально-натасканный скрипт
Я выбрал второй вариант, выкачивать целиком сайт оказалось слишком долго.
Итак, от скрипта нам надо 2 вещи:
- чтобы рекурсивно перелопачивал директории
- и чтобы искал по регулярному выражению
Итоговый скрипт удаления вирусов на сайте:
////////////////////////////////////////////////////////// // Рекурсивная функция - спускаемся вниз по каталогу ////////////////////////////////////////////////////////// function scan_dir($dirname) { // Объявляем переменные замены глобальными GLOBAL $text, $retext; // Открываем текущую директорию $dir = opendir($dirname); // Читаем в цикле директорию while (($file = readdir($dir)) !== false) { // Если файл обрабатываем его содержимое if($file != "." && $file != "..") { // Если имеем дело с файлом - производим в нём замену if (preg_match("/(.php)$/is",$file)) { //искать в php файлах. Меняйте на js или html по надобности; или другие форматы if(is_file($dirname."/".$file)) { // Читаем содержимое файла $content = file_get_contents($dirname."/".$file); // Осуществляем замену //if (preg_match ('##is', $content )) { /* эта закомментированная строка ищет строку, начинающюся на */ if (preg_match ('#document.write('(function g(){var r=new RegExp)(.*?)#is', '', $content); //$content = str_replace($text, $retext, $content); /* можно и по-простому str_replace`ом вместо вышестоящего preg_replace. в конце файла надо раскомментировать 2 строки */ // Перезаписываем файл file_put_contents($dirname."/".$file,$content); echo $dirname."/".$file."---
";//exit; /* этот exit чтобы останавливать после первого нахождения и проверять где что нашёл. Желательно закомментировать строку выше file_put_contents(...), чтобы файл не перезаписался, пока вы тестируете скрипт. */ } } } // Если перед нами директория, вызываем рекурсивно // функцию scan_dir if(is_dir($dirname."/".$file)) { //echo $dirname."/".$file."
"; scan_dir($dirname."/".$file); } } } // Закрываем директорию closedir($dir); } //$text = '$text'; // Искомая строка //$retext = '$retext'; // Строка замены //вдруг понадобится :) выше закомментирован str_replace по этому поводу $dirname = $_SERVER["DOCUMENT_ROOT"];//""; scan_dir($dirname); // Вызов рекурсивной функции
Можете скачать этот файл, если код некорректно отображается.
Честно не помню где взял заготовку рекурсивного обхода директорий и модифицировал под свои нужды.
Не забудьте сделать резервную копию :) А то мало ли что.
Ну и если поисковики уже прочухали, что сайт заражён и повесили угрожающую приписку в выдаче, то надо быстро добавить сайт в панели вебмастера на Яндексе и Гугле и катать заявку, что посыпаете голову пеплом и больше такого не повторится.

Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование).
Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час. Часовой пояс — московский.
Помогла статья? На поездку на море (Охотское):
1000 р./час. Часовой пояс — московский.

Помогла статья? На поездку на море (Охотское):
перейти в Блог | Блог (стр. 15)
Ударим лайками по бездорожью, разгильдяйству и бюрократизму!
Ключевые слова (тэги): PHP 78 web-программирование 103
Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю-: