Идея на нова. Проще сделать следить за контрольной суммой ф-лов и директорий. Написать скрипт, который из крона каждые 5 минут будет это проверят. В случае изменения контрольной суммы файла\директории создавать страничку "ворненг! одей сплойтенг детектед!" и закрывать доступ к сайту А твой способ не сработает при банальном протраянивании файла.
Talisman Если бы все думали как Вы, сейчас php был бы правительственной тайной Я думаю, что это не Вы написали =/ Прям уж0с, я думаю кому надо, тот разберется как доделать =)
Можно написать скрипт который будет выводить на вашу страницу...коглда и какой файл изменился посл.раз.... Если допустим это было сделано не с вашего ип, то....эм.....че-нить делаем... Уйма способов
Это уже не антивирусы обсуждаются, а... ну... фильтры что ли... под антивирусами я бы понимал какие-нить анти-руткиты или типа...
А имена шеллов всегда такие будут? PHP: $safe_files = array("index.php","about.php","add.php", "xek.php", "antivir.php", "comments.php", "xekker.php", "files.php", "admin.php", "myshell.php", "navigation.php", "work.php", "bottom.php","config.php","top.php","main.php","papers.php","search.php","lol.php");
У него в коде написано А точнее коммент и имя массива. Вот я и подумал что это разрешаемые файлы. Весь код я не смотрел.
Вспоминай) Вообще-то на сервере файлы лежат в изначальном виде (формате), это когда они вызываются по-другому (к примеру через mod_rewrite в .htaccess), их сервер открывает. Так что если это банальный шелл, то он всегда будет на сервере лежать как .php файл.
Я завтра напишу на Php, но в моей версии кроме отправления сообщения на мыла, сайт будет закрыватся (тут естевственно надо под конкретный проект писать)
4 Nightmarе. Делать было нечего, сделал Скрипт пользуеца мускулом, предварительно ему нужны данные для доступа. Он делает слепок директории и заносит в базу, делая мд5 и определяя размер файлов и директоии. При проверке эти данные сверяются, если что-то не совпадает то в корне контролируемой директоии создается .htaccess блокирующий файл для всех (кто хочет может поменять на локалхост) и высылает репорт админу. Code: <?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> Юзай на здоровье. З.Ы. Просьба на корявости не обращать внимания, ибо писал ночью и особенной ценности скрипт для меня не представлял. З.Ы.Талисману пасиба за реверсивный поиск, ибо самому было лень)
В идеале брать чексум файла и проверять на изменение. Скрипт кодится зендом и все. никаких проблем. Зенд платный? О_о
Безусловно скрипт не имеет смысла и не от чего не защищает. Защита от инклюда файлов должна быть сделана на основании серии исследований: 1) Проверка контрольной суммы всех файлов. 2) Поиск записей в файлах, которые попадают под возможности шела (типа инклюде, eval , system и т. д.) . Файлы в которых нужны эти функции и места в них помечаются (хотя по любому проверка мд5 такие файлы защитит). 3) Создаем серию ловушек. Типо файлы конфигов и мониторим время их просмотра. В случае измениния времени начинаем думать какая зараза смотрит наши файлы. Этого будет достаточно. Могу тоже самое продолжить про мониторинг всег sql инъекций, но это на уровне шаре хостинга реализовать сложнее.
4 Егорыч+++ Полностью прав, но для магазина к примеру скрипт вполне подойдет. 4 Nightmarе & 4 The_HuliGun всегда пожалуйста, если нада туда чонить дописать пишите в аську, без проблем. 4 Isis вообще-то скрипт желательно запоролить, или поставить доступ с одного Ip. недостаток в том, что пароли к базе в открытом виде, но есть зенд)