есть ли нормальные сканеры которыми можно сделать список хешей всех файлов и папок - и проверять файлы на изменения хеша и появление новых "не всписке" файлов на хостинге ?
Есть разного рода сервисы http://habrahabr.ru/company/santi/blog/202976/ но я ими никогда не пользовался. Делай бэкап и делай слепок мд5суммы файлов, сверяй кроном ежедневно и если че делай дифф файлов. В принципе все просто.
вариант делать слепок бэкапа хороший, но долгий, иногда скорость неочень высокая что бы скачать копии я вот скрипт один когда то в сети нашёл, немного его доделал, но здесь нет возможности показа новых файлов, которые появились после обновления снимка хэш сумм. скрипт удобный, но я не знаю как прикрутить сюда фитчу - что бы показывал новые файлы на хостинге. Помогите пожалуйста кто в php силен, что можно дописать сюда? PHP: <?phperror_reporting (0);header('Content-Type: text/html; charset=UTF-8');header("X-Frame-Options: DENY");header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');date_default_timezone_set('Europe/Moscow');$md5_file = "/folder/logs.txt"; // укажите имя кеш файла$allowExt = ".php|.html|.tpl|.htm|.htaccess|.js|.css|.ini|.txt|.sql|.png|.gif|.ico|.jpg"; // типы файлов которые обрабатывать( вписывать с точкой вначале и разделять знаком | )$allowDir = ""; // папки которые обрабатывать (разделять знаком | ), оставить пустым, если все$skipDir = "cache|temp"; // папки которые НЕобрабатывать (разделять знаком | ), оставить пустым, если не нужно ничего пропускать$skipFileGlobal = "logs.txt|filename.php"; // имена файлов которые пропускать. Будут пропускаться все файлы с таким именем в любой папке$skipFile = ""; // пропускать конкретные файлы. указать полный путь. разделять "|" // чтобы определить полный путь: делаем первое обновление хеша // открываем файл с хешом, находим нужный файл во второй колонке и копируем полный путь$adminMail = "email@mail.onion"; // почта на которую уйдет отчет об измененных файлах$mail_subject = "почтовый лог"; // тема для письма с отчетом$adminPassword = "43gfdgrtyhfugdf673wf"; // пароль. для сброса хеша файлов в md5$scriptDir = ""; // папка в которой расположен скрипт относительно корня сайта. без слешей на концах пр. "folder", "folder1/folder2" // оставить пустым, если скрипт в корне$xmail = array();$xmail['subject'] = $mail_subject;$xmail['headers'] = 'MIME-Version: 1.0' . "\r\n". 'Content-type: text/html; charset=windows-1251' . "\r\n". 'From: '.$adminMail. "\r\n" . 'Reply-To: '.$adminMail. "\r\n" . 'X-Mailer: PHP/' . phpversion();$xmail['adminMail'] = $adminMail;$allowExt = str_replace(".","\.",$allowExt);$skipFile = explode("|",$skipFile);$skipFileGlobal = explode("|",$skipFileGlobal);if (trim($scriptDir) != ""){$ex = "-".(strlen($scriptDir) + 1);$BASE = substr(dirname(__FILE__),0,$ex);$md5_file = $BASE."/".$scriptDir."/".$md5_file;} else {$BASE = dirname(__FILE__);$md5_file = $BASE."/".$md5_file;}if (!is_dir($BASE."/".$scriptDir)) die("Папка \"$scriptDir\" отсутсвует - создайте её, или измените параметр \"$ sсriptDir\" в настройках");define("ABSPATH",$BASE);function write_md5(){ global $md5_file; $md5 = dir_md5(); $md5_from_file = @fopen($md5_file, 'w'); foreach ($md5 as $key=>$val) @fwrite($md5_from_file, "$val\t$key\n");}function checker(){ global $md5_file,$xmail,$adminPassword; $i = 1; if (!file_exists($md5_file)) { write_md5(); } if ( $_POST['updatemd5'] ) { if ( md5(trim($_POST['password'])) == $adminPassword ) { write_md5();//выполняем скрипт замены даты и времени$select_file_touch = $md5_file;if (!touch($select_file_touch, strtotime('2014-09-15 18:21:37'))) { echo '<font color="#FF0000">Упс, что-то пошло не так... дата файла не исправлена</font>';} else {// echo '<p><b><font color="#008000">Модификация времени и даты файла прошла успешно!</font></b><br><b><font color="#696969">Папка / Файл: </font></b><font color="#008000"><b>'.$select_file_touch.'</b></font></p>';}//конец выполнения скрипта } else { echo '<h3>Неверный пароль</h3>'; } } $md5 = dir_md5(); if (file_exists($md5_file)) { $md5_from_file = file($md5_file); if ( !$md5_from_file ) { write_md5(); $md5_from_file = file($md5_file); } $mailBody = ""; $error = ""; while (list($ln, $line) = each($md5_from_file)) { list($md, $ff) = explode("\t", trim($line)); if ($md != $md5[$ff]) { $ff = str_replace(ABSPATH, '/', $ff); $ff = str_replace('//', '/', $ff); $error .= "<br />$i. $ff - <font color='red'>изменен</font>";if (file_exists($_SERVER['DOCUMENT_ROOT'].$ff)) {} else {echo '<font color="#FF0000">Файл <b><u>'.$ff.'</u></b> отсутствует!<br></font>';} $mailBody .= "<br />$i. $ff - изменен" . "\r\n"; $i++; } } //if($mailBody != "" && $_GET['send'] == 1) @mail($xmail['adminMail'], $xmail['subject'], $mailBody, $xmail['headers']);//отправить на почту } if ($_GET['send'] != 1) { if ( $i == 1 ) { echo "<br /><h3><font color='green'>Всё ок!</font></h3>"; } else { echo $error; } echo '<br /> <br /> <form method="post" action=""> пароль: <input type="text" id="" name="password" value=""> <input type="submit" id="updatemd5" name="updatemd5" value="Сбросить/обновить хэш файлов"><br><input type="button" title="Обновить страницу" value="Обновите страницу" onClick="window.location.href=window.location.href" style="cursor:pointer; cursor:hand;"> </form>'; }}function dir_md5() { global $md5,$allowDir; if($allowDir != ""){ find_md5(ABSPATH, 0); $aDir = explode("|",$allowDir); while (list($key, $dir) = each($aDir)){ find_md5(ABSPATH .'/'. $dir, 1); } }else{ find_md5(ABSPATH, 1); } return $md5;}function find_md5($path, $recurs) { global $md5,$allowExt,$skipDir,$skipFile,$skipFileGlobal; if ($skipDir != "" and preg_match("#$skipDir$#i", $path)) $skip = 1; if ($dir = @opendir($path) and $skip != 1 ) { while($file = readdir($dir)) { if ($file == '.' or $file == '..' ) continue; if (!in_array($file,$skipFileGlobal)) { $file = $path . '/' . $file; if (is_dir($file) && $recurs) { find_md5($file, 1); } if (!in_array($file,$skipFile)) { if (is_file($file) && preg_match("/$allowExt/i", $file)) { $md5[$file] = md5(join ('', file($file))); } } } } closedir($dir); }}checker();?>
Скрипт удобный. Но неправильный. Обрабатываются запросы на стороне сервера, а результаты присылаются клиенту - это раз. Технические огрехи в коде скрипта - это два: header('Content-Type: text/html; charset=UTF-8'); $xmail['headers'] = 'MIME-Version: 1.0' . "\r\n".'Content-type: text/html; charset=windows-1251'