Контроль целостности файлов сайта

Discussion in 'Песочница' started by dondy, 24 Jul 2015.

  1. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    есть ли нормальные сканеры которыми можно сделать список хешей всех файлов и папок - и проверять файлы на изменения хеша и появление новых "не всписке" файлов на хостинге ?
     
  2. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    Есть разного рода сервисы http://habrahabr.ru/company/santi/blog/202976/ но я ими никогда не пользовался. Делай бэкап и делай слепок мд5суммы файлов, сверяй кроном ежедневно и если че делай дифф файлов. В принципе все просто.
     
    _________________________
    dondy likes this.
  3. dondy

    dondy Member

    Joined:
    5 Jun 2015
    Messages:
    560
    Likes Received:
    61
    Reputations:
    5
    вариант делать слепок бэкапа хороший, но долгий, иногда скорость неочень высокая что бы скачать копии

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

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

    Помогите пожалуйста кто в php силен, что можно дописать сюда?

    PHP:
    <?php
    error_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_touchstrtotime('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 == ) {
                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(ABSPATH0);
            
    $aDir explode("|",$allowDir);
            while (list(
    $key$dir) = each($aDir)){
                
    find_md5(ABSPATH .'/'$dir1);
            }
        }else{
            
    find_md5(ABSPATH1);
        }
        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 != ) {

            while(
    $file readdir($dir)) {
                if (
    $file == '.' or $file == '..' ) continue;

                if (!
    in_array($file,$skipFileGlobal)) {
              
                    
    $file $path '/' $file;
                    if (
    is_dir($file) && $recurs)  {
                        
    find_md5($file1);
                    }
              

                    if (!
    in_array($file,$skipFile)) {
                        if (
    is_file($file) && preg_match("/$allowExt/i"$file)) {
                            
    $md5[$file] = md5(join (''file($file)));
                        }
                    }
                }
            }
            
    closedir($dir);
         }
    }

    checker();
    ?>
     
  4. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    жесть на пхп да еще не под CLI ты реально жжош
     
    _________________________
  5. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,697
    Likes Received:
    3,139
    Reputations:
    236
    Скрипт удобный. Но неправильный.

    Обрабатываются запросы на стороне сервера, а результаты присылаются клиенту - это раз.
    Технические огрехи в коде скрипта - это два:
    header('Content-Type: text/html; charset=UTF-8');
    $xmail['headers'] = 'MIME-Version: 1.0' . "\r\n".'Content-type: text/html; charset=windows-1251'
     
    dondy likes this.