Я уже приготовился переезжать на другой хостинг для проверки, уязвимы мои скрипты или хостинг, но сегодня хостер пообещал, что файлы .htaccess больше не изменяться. Похоже они что-то у себя всё-таки нашли и отключили фунцию exec. Минус в этом то, что и планировщик cron больше работать не будет. В нём я указал запуск скрипта каждую минуту, который проверял все файлы .htaccess и восстанавливал их.
Вот этот скрипт, может кому пригодится:
- Код: Выделить всё
<?php
// контроль файлов
class file_checker
{
// Задайте константы !!!
// Файловые константы
const START_DIR = '/home/<аккаунт>/data/'; // стартовая директория для поиска
const FILE_CONTENTS = '/home/<аккаунт>/data/www/<домен>/work/checker/contents.dat'; // файл для хранения содержимого проверяемых файлов
const DIR_LOG = '/home/<аккаунт>/data/www/<домен>/work/checker/logs/'; // директория - куда будут скидываться логи об изменениях проверяемых файлов
// Почтовые константы
const E_TO = "<логин>@yandex.ru"; // Введите адрес (или адреса) электронной почты, куда будет отправляться уведомление
const E_SUBJ = "Файлы на сайте изменены !!!"; // Введите тему присылаемого письма
const E_FROM = "admin@<домен>"; // от кого письмо
// Пароль для запуска сохранения исходного состояния файлов
const PASS = 'gfhjkm';
// Переменные
private $allowed_ext = array('htaccess'); // расширения файлов, которые хотим контролировать
private $path_files = array(); // здесь хранятся пути проверяемых файлов
// функция проверяет контролируемые файлы и восстанавливает их содержимое
function check_files()
{
$files_contents = unserialize(file_get_contents(self::FILE_CONTENTS));
$log = '';
foreach($files_contents as $file => $check_contents)
{
$contents = @file_get_contents($file);
if ($contents != $check_contents)
{
file_put_contents($file, $check_contents);
$log = $file . ' был изменен в ' . date('H:i:s',time()) . "\n\n" . $contents . "\n\n\n\n";
file_put_contents (self::DIR_LOG . date('Y-m-d',time()) . '.log', $log, FILE_APPEND);
}
}
if ($log)
{
$this->send_mail('Изменения произошли ' . date('m-d-Y в H:i:s',time()));
}
}
// поиск всех файлов начиная с директории $start_dir и сохранение полных путей в $this->path_files
function find_files($start_dir)
{
if ($start_dir{strlen($start_dir)-1} != '/') $start_dir .= '/'; // если в конце директории нет слеша, то добавим
$files = scandir($start_dir); // получаем список файлов в директории
foreach($files as $file)
{
if ($file == '.' or $file == '..') continue;
$fullpath_file = $start_dir . $file; // полный путь файла
if (is_dir($fullpath_file))
{
$this->find_files($fullpath_file); // если это не файл, а директория, то рекурсивный вызов функции
}
else
{
if (in_array(substr(strrchr($file, '.'), 1), $this->allowed_ext))
{
$this->path_files[] = $fullpath_file;
}
}
}
}
// функция сохраняет содержимое контролируемых файлов в виде сериализованной строки
function save_contents()
{
$this->find_files(self::START_DIR);
$files_contents = array();
foreach($this->path_files as $file)
{
if(false !== $contents = file_get_contents($file))
{
$files_contents[$file] = $contents;
}
}
file_put_contents(self::FILE_CONTENTS, serialize($files_contents));
}
// вывод на экран контролируемые файлы
function show_files()
{
$files_contents = unserialize(file_get_contents(self::FILE_CONTENTS));
foreach ($files_contents as $file => $contents)
{
echo $file . '<br>';
}
}
// отправка сообщения по электронке
function send_mail($mess)
{
$headers = "MIME-Version: 1.0\n";
$headers .= 'From: '. self::E_FROM . "\n";
$headers .="Content-type: text/html; charset=utf-8";
mail(self::E_TO, self::E_SUBJ, $mess, $headers);
}
}
$checker = new file_checker;
$pass = $mode = '';
if (isset($_GET['pass'])) $pass = trim(strip_tags(($_GET['pass'])));
if (isset($_GET['mode'])) $mode = trim(strip_tags(($_GET['mode'])));
if (file_checker::PASS == $pass and $mode == 'save')
{
$checker->save_contents();
}
elseif ($mode == 'show')
{
$checker->show_files();
}
else
{
$checker->check_files();
}
exit;
?>
скрипт.php?mode=save&pass=gfhjkm
2. Для просмотра какие файлы контролируются:
скрипт.php?mode=show
3. Для контроля файлов вызываем скрипт без параметров:
скрипт.php