.
Место для Вашей рекламы
23 Август 2010

Скрипт отслеживания изменений в файлах

posted in Полезности, Программирование |

apple_worm

Этот скрипт как и предыдущий, контролирующий доступность сервера, нужно было написать ещё 5 лет тому назад. Последней каплей сподвинувшей стал взлом одного из моих сайтиков, в результате чего сильно попадали позиции 🙁

В общем идея как всегда очень простая, даже не знаю почему хостеры не предоставляют подобный функционал:

Раз в (период времени) делается «снимок» файловой системы (например корневой каталог вашего сайта) с учётом поддиректорий (в принципе в список можно добавить исключения) и сливается с результатами снимка сделанного за предыдущий запуск скрипта, если есть разногласия в размерах файлов (сначала md5 делал — в конечном итоге подумал, что достаточно и размера …) информируем владельца сайта о найденных разногласиях.

По началу сваял скрипт не используя выгрузки в файлы — всё на массивах, но он не выдержал проверки моего основного рабочего домена — там сотни тысяч файлов — сдох по нехватке памяти.

После чего вообще решил только практически на командах ОС всё сделать «ls -lR» + «diff«, но так и не получилось вывести в ls файлы с полным абсолютным путём,  в конечном итоге получился некий симбиоз который и выкладываю на ваш суд:

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 комментариев на запись “Скрипт отслеживания изменений в файлах”

Почему бы Вам не высказать своем мнение! Позвольте нам узнать, что Вы думаете...

  1. 1 On 25.08.2010, даша said:

    у тебя в примере всё правильно написано ?

    залила себе, не работает ((

  2. 2 On 25.08.2010, GTAlex said:

    На что ругается ?

  3. 3 On 28.08.2010, GTAlex said:

    Воткнул скриптик везде где нужно — ежедневно отчётики приходят — всё под контролем !
    Так гораздо спокойнее скажу я вам, в купе со скриптом проверки доступности сайта вообще ништяк.

  4. 4 On 29.08.2010, Роман Матвейчук said:

    У всех хостеров обычно есть функция отправки емайл на адрес владельца сайта, если сайт был не доступен. Не проще ли?

  5. 5 On 31.08.2010, vitalik said:

    Попробую воспользоваться . Думаю все пройдет неплохо

  6. 6 On 03.09.2010, armagedon said:

    Не вижу нужды в таких скриптах, в любом фтп менеджере, вроде файл зиллы есть фича, которая высовыает все файлы из любой папки и сортирует их по дате изменения, так легко моно определить зараженный файл.

  7. 7 On 03.09.2010, GTAlex said:

    Армагедон, вот предположим у тебя 10-50 сайтов на всяческих разнообразных хостингах, даже тупо заходить каждый день проверять морды времени нет, а ты предлагаешь заходить фтп менеджером и проверять даты модификаций 🙂 ???

    к тому же более менее нормальный хакер дату изменения поставит назад — ведь это обычный атрибут файла…
    а вот с размером будет уже не так просто 🙂 (хотя можно)
    по идее надо всё таки типа md5 проверочки ставить, но это сразу отразится на быстродействии

  8. 8 On 30.09.2010, MoJo said:

    Спасибо автору ещё раз. Надо попробовать скрипт в действии.

  9. 9 On 17.12.2010, Блог-шоу - выпуск 42 said:

    […] создал скрипт отслеживания изменений в файлах, который будет полезен владельцам […]

  10. 10 On 12.02.2011, Мимо проходил said:

    Нужно поменять > на сооответстующий знак больше

    Переменная $_GET непроверена

  11. 11 On 12.02.2011, Мимо проходил said:

    Нужно поменять & g t ; на сооответстующий знак больше

    Переменная $_GET непроверена

Оставить комментарий

Яндекс.Метрика