Этот скрипт как и предыдущий, контролирующий доступность сервера, нужно было написать ещё 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 непроверена