
Этот скрипт как и предыдущий, контролирующий доступность сервера, нужно было написать ещё 5 лет тому назад. Последней каплей сподвинувшей стал взлом одного из моих сайтиков, в результате чего сильно попадали позиции 🙁
В общем идея как всегда очень простая, даже не знаю почему хостеры не предоставляют подобный функционал:
Раз в (период времени) делается “снимок” файловой системы (например корневой каталог вашего сайта) с учётом поддиректорий (в принципе в список можно добавить исключения) и сливается с результатами снимка сделанного за предыдущий запуск скрипта, если есть разногласия в размерах файлов (сначала md5 делал – в конечном итоге подумал, что достаточно и размера …) информируем владельца сайта о найденных разногласиях.
По началу сваял скрипт не используя выгрузки в файлы – всё на массивах, но он не выдержал проверки моего основного рабочего домена – там сотни тысяч файлов – сдох по нехватке памяти.
После чего вообще решил только практически на командах ОС всё сделать “ls -lR” + “diff“, но так и не получилось вывести в ls файлы с полным абсолютным путём, в конечном итоге получился некий симбиоз который и выкладываю на ваш суд:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
set_time_limit(0); ignore_user_abort(); ini_set(‘display_errors’,1); ini_set(“error_reporting”, E_ALL); // папочка, которую контролируем (включая подпапки) $rootdir = “./”; // куда кладём инфу о изменениях $diffdir = “./diffdir/”; // настройки для оповещения мылом $mailto = “admin@gmail.com”; $subject = “Allert”; $message = “”; include_once(“dBug.php”); // этот дебаг класс для отображения расхождений, берём тута http://dbug.ospinto.com // если id задан смотрим старые изменения по номеру if (isset($_GET[‘id’])) { $id = $_GET[‘id’]; $buf = file_get_contents($diffdir.$id); new dBug(unserialize($buf)); die(); } if (!rename($diffdir.“curr.txt”, $diffdir.“old.txt”)) { dir(“rename error”); } $fp = fopen($diffdir.“curr.txt”,“a+”); //собираем длинны всех файлов указанной директории $rootdir checkmd($rootdir); fclose($fp); // непосредственно сравнивает два файла (средствами команды ОС diff) exec(“diff “.$diffdir.“curr.txt “.$diffdir.“old.txt >”.$diffdir.“diff.txt”); // обрабатываем и выплёвываем в удобный нам вид результат предыдущей команды $arr = file($diffdir.“diff.txt”); foreach ($arr as $ar) { $str = trim($ar,” \r\n\t”); @list($dir,$len,$file) = split(” “,$str); if (!isset($file)) continue; // пропускаем файлы из папки diffstat if (strstr($file,$diffdir)) continue; $diff[$file][$dir] = $len; $message.=$file.“\t”.$dir.” “.$len.“\n”; } // оповещаем о изменениях на мыло if (!empty($diff)) { mail($mailto, $subject, $message); file_put_contents($diffdir.time(),serialize($diff)); new dBug($diff); } else { echo “changes not found”; } // функция сбора информации о файлах в директории function checkmd($cat) { global $fp; $dir = dir($cat); while($file = $dir–>read()) { if ($file==‘.’ or $file==‘..’) continue; if (is_dir($cat.$file)) { checkmd($cat.$file.‘/’); } $md5 = filesize($cat.$file); fwrite($fp,$md5.” “.$cat.$file.“\n”); } } |
<Хвостовой>
Онлайн обучение бизнесу все сильнее входит в нашу жизнь. Благодаря развитию Интернета, теперь каждый может воспользоваться такой возможностью.
Хвостовой>
11 комментариев на «“Скрипт отслеживания изменений в файлах”»
у тебя в примере всё правильно написано ?
залила себе, не работает ((
На что ругается ?
Воткнул скриптик везде где нужно – ежедневно отчётики приходят – всё под контролем !
Так гораздо спокойнее скажу я вам, в купе со скриптом проверки доступности сайта вообще ништяк.
У всех хостеров обычно есть функция отправки емайл на адрес владельца сайта, если сайт был не доступен. Не проще ли?
Попробую воспользоваться . Думаю все пройдет неплохо
Не вижу нужды в таких скриптах, в любом фтп менеджере, вроде файл зиллы есть фича, которая высовыает все файлы из любой папки и сортирует их по дате изменения, так легко моно определить зараженный файл.
Армагедон, вот предположим у тебя 10-50 сайтов на всяческих разнообразных хостингах, даже тупо заходить каждый день проверять морды времени нет, а ты предлагаешь заходить фтп менеджером и проверять даты модификаций 🙂 ???
к тому же более менее нормальный хакер дату изменения поставит назад – ведь это обычный атрибут файла…
а вот с размером будет уже не так просто 🙂 (хотя можно)
по идее надо всё таки типа md5 проверочки ставить, но это сразу отразится на быстродействии
Спасибо автору ещё раз. Надо попробовать скрипт в действии.
[…] создал скрипт отслеживания изменений в файлах, который будет полезен владельцам […]
Нужно поменять > на сооответстующий знак больше
Переменная $_GET непроверена
Нужно поменять & g t ; на сооответстующий знак больше
Переменная $_GET непроверена