Показать сообщение отдельно

  #34  
Старый 24.09.2007, 05:23
life_is_shit
Постоянный
Регистрация: 21.08.2007
Сообщений: 367
Провел на форуме:
3578960

Репутация: 468
Отправить сообщение для life_is_shit с помощью ICQ
По умолчанию

4 Nightmarе.
Делать было нечего, сделал

Скрипт пользуеца мускулом, предварительно ему нужны данные для доступа.
Он делает слепок директории и заносит в базу, делая мд5 и определяя размер файлов и директоии.
При проверке эти данные сверяются, если что-то не совпадает то в корне контролируемой директоии создается
.htaccess блокирующий файл для всех (кто хочет может поменять на локалхост) и высылает репорт админу.

Код:
<?php
$server = 'localhost';     //хост
$username = 'anti_change'; //юзер мускула
$password = 'password';    //пароль мускула
$database = 'anti_change'; //база мускула
$path = 'C:/TopServer/home/localhost/wordpress'; //реальный путь к контролируемой директории
$mail_to = 'admin@localhost';  //кому писать репорт
$mail_from = 'axtung@localhost';  //от кого
$mail_subj = 'axtung!!!';  //тема письма

mysql_connect($server, $username, $password);
mysql_select_db($database);

function scan_dir($dirname) 
  { 
    GLOBAL $text, $retext; 
    $dir = opendir($dirname); 
    while (($file = readdir($dir)) !== false) 
    { 
      if($file != "." && $file != "..") 
      { 
      if(is_file($dirname."/".$file)) 
        { 
          $sql = "INSERT INTO `first_scan` (`category`, `name`, `md5_file`, `size`) VALUES ('file', '".$dirname."/".$file."', '".md5_file($dirname.'/'.$file)."', '".filesize($dirname.'/'.$file)."')";
          mysql_query($sql);
        } 
        if(is_dir($dirname."/".$file)) 
        { 
          $sql = "INSERT INTO `first_scan` (`category`, `name`, `md5_file`, `size`) VALUES ('directory', '".$dirname."/".$file."', '---', '".disk_total_space($dirname."/".$file)."')";
          mysql_query($sql);
          scan_dir($dirname."/".$file); 
        } 
      } 
    } 
    closedir($dir); 
  }

function check_dir($dirname) 
  { 
    GLOBAL $text, $retext; 
    $dir = opendir($dirname); 
    while (($file = readdir($dir)) !== false) 
    { 
      if($file != "." && $file != "..") 
      { 
      if(is_file($dirname."/".$file)) 
        { 
          $sql = "SELECT * FROM `first_scan` WHERE `name` = '".$dirname."/".$file."' and `category` = 'file'";
          $result_file = mysql_query($sql);
          $array_file = mysql_fetch_array($result_file);
          if ($array_file)
          {
             if ($array_file['md5_file'] != md5_file($dirname.'/'.$file)) 
             {
                $sql_md5 = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('error md5_file', '".$dirname."/".$file." error checksum')";
                $res=mysql_query($sql_md5);
             }  
             if ($array_file['size'] != filesize($dirname.'/'.$file)) 
             {
                $sql_size = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('error size file', '".$dirname."/".$file." error size file')";
                mysql_query($sql_size);
             }       
          }
          else
          {
            $sql_nf = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('file not found', '".$dirname."/".$file." file not found')";
            mysql_query($sql_nf);
          }
        } 
        if (is_dir($dirname."/".$file)) 
        { 
          $sql = "SELECT * FROM `first_scan` WHERE `name` = '".$dirname."/".$file."' and `category` = 'directory'";
          
          $result_dir = mysql_query($sql);
          $array_dir = mysql_fetch_array($result_dir);
          if ($array_dir)
          {
             if ($array_dir['size'] != disk_total_space($dirname."/".$file)) 
             {
                $sql_size = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('error size directory', '".$dirname." error size directory')";
                mysql_query($sql_size);
             }       
          }
          else
          {
            $sql_nf = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('directory not found', '".$dirname."/".$file." directory not found')";
            mysql_query($sql_nf);
          }
          check_dir($dirname."/".$file);
        } 
      } 
    } 
    closedir($dir); 
  }
  
function check_del()
{
  $sql = "SELECT * FROM `first_scan`";
  $result = mysql_query($sql);
  while ($array = mysql_fetch_array($result))
  {
    if (!is_dir($array['name']) && ($array['category'] == 'directory'))
    { 
      $sql_del_dir = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('directory deleted', '".$array['name']." directory deleted')";
      mysql_query($sql_del_dir);
    }  
    if (!file_exists($array['name']) && ($array['category'] == 'file'))
    {
      $sql_del_file = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('file deleted', '".$array['name']." file deleted')";
      mysql_query($sql_del_file);
    }  
  }
}
  
if (isset($action) && ($action == 'first')) 
{ 
  mysql_query("DROP TABLE `axtung!`");
  mysql_query("CREATE TABLE `axtung!` (
  `id` int(11) NOT NULL auto_increment,
  `category_error` text,
  `description` text NOT NULL,
  PRIMARY KEY  (`id`)
  ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1");
  mysql_query("DROP TABLE `first_scan`");
  mysql_query("CREATE TABLE `first_scan` (
  `id` int(10) NOT NULL auto_increment,
  `category` text NOT NULL,
  `name` text NOT NULL,
  `md5_file` text NOT NULL,
  `size` text NOT NULL,
  PRIMARY KEY  (`id`)
  ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=501;
  ");
  scan_dir($path);
  echo 'слепок сделан';
}

if (isset($action) && ($action == 'check'))
{
  check_dir($path);
  check_del();
  $mail = '';
  $report = '';
  $sql_mail = "SELECT * FROM `axtung!`";
  $result = mysql_query($sql_mail);
  while ($array = mysql_fetch_array($result))
  {
    $mail .= $array['description']."\n";
    $report .= $array['description']."<br>";
  }
  if (!empty($mail))
  {
    $fh = fopen ('C:/TopServer/home/localhost/wordpress/.htaccess', "w");
    fwrite($fh, "\n"."deny from all");
    fclose ($fh);
    mail('admin@localhost','axtung!',$mail,"From: axtung@localhost\r\n");
    echo 'Ахтунг!!!<br>'.$report.'Внимание доступ к сайту закрыт!!!';
  }
  else
  {
    echo 'Все норм, спи спокойно';
  }
}
if (isset($action) && ($action == 'clear_error'))
{
  mysql_query('TRUNCATE `axtung!`');
  echo 'лог очищен';
}
?>
<form action="<?=basename($PHP_SELF)?>?action=first" method="POST">
  <input type="submit" value="создать слепок файловой системы">
</form>
<br>
<form action="<?=basename($PHP_SELF)?>?action=check" method="POST">
  <input type="submit" value="проверить">
</form>
<br>
<form action="<?=basename($PHP_SELF)?>?action=clear_error" method="POST">
  <input type="submit" value="очистить лог из базы">
</form>
Юзай на здоровье.

З.Ы. Просьба на корявости не обращать внимания, ибо писал ночью и особенной ценности скрипт для меня не представлял.
З.Ы.Талисману пасиба за реверсивный поиск, ибо самому было лень)

Последний раз редактировалось life_is_shit; 24.09.2007 в 05:25..
 
Ответить с цитированием