ProfiPHPProfiPHP
Категория: Полезное в PHP

Контроль за целостностью файлов Web ресурса

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

Похожих ситуаций можно навести огромное количество. Большинство из них очень сложно определить, поскольку они будут выполнять прозрачные для пользователя действия. Конечно, в данном случае необходимо восстановить файлы и просмотреть логи, чтобы узнать причину их появления. Но данный промежуток времени, от момента изменения файла до его обнаружения, может быть очень долгим, что может повлиять, например, на репутацию сайта в поисковых системах и других показателях.

Самым простым способом контроля файлов является их рекурсивное чтение, с последующим возвращением MD5-хэш файлов. Далее необходимо сравнить файл, созданный предыдущей операцией сканирования, с текущим состоянием. Если MD5-хэш файла не совпадает, значит в нем были внесены изменения.

Данный скрипт можно значительно усовершенствовать, добавляя дату изменения, новые файлы и другую важную информацию. Я сейчас опишу самый простой метод, но вполне рабочий.

Для начала необходимо просканировать всю файловую систему Web ресурса. Для этого выполняем следующий код:
function scan_dir( $path )
{
if ( $content_scan_dir = glob( $path.'/*') )
{
foreach ( $content_scan_dir as $object )
{
if ( is_dir( $object ) ) {
scan_dir( $object );
}
else {
@chmod( $object, 0644 );
if ( in_array( pathinfo( $object, PATHINFO_EXTENSION ), array( 'php', 'js', 'css' ) ) ) {
$data = array( 'file' => str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object ), 'hash' => md5_file( $object ) );
// Записываем строку в файл:
@chmod( $_SERVER['DOCUMENT_ROOT'].'/filename.dat', 0777 );
$fopendb = fopen( $_SERVER['DOCUMENT_ROOT'].'/filename.dat', 'a+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, serialize( $data )."\n" );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $_SERVER['DOCUMENT_ROOT'].'/filename.dat', 0644 );
}
}
}
}
}
scan_dir( $_SERVER['DOCUMENT_ROOT'] );
Результатом выполнения данного кода будет создание файла "filename.dat", в котором будут содержатся все файлы вместе с их MD5-хэшом.

Далее необходимо проверять текущее состояние файлов из содержанием файла "filename.dat":
@chmod( $_SERVER['DOCUMENT_ROOT'].'/filename.dat', 0644 );
$array_filedb = file( $_SERVER['DOCUMENT_ROOT'].'/filename.dat' );
$array_file_hash = array( );
$count = count( $array_filedb );
for ( $i = 0; $i < $count; $i++ ) {
$messold = unserialize( $array_filedb[ $i ] );
$array_file_hash[ $messold['file'] ] = $messold['hash'];
}

function checking_files( $path )
{
global $array_file_hash;
if ( $content_scan_dir = glob( $path.'/*') )
{
foreach ( $content_scan_dir as $object )
{
if ( is_dir( $object ) ) {
checking_files( $object );
}
else {
@chmod( $object, 0644 );
if ( in_array( pathinfo( $object, PATHINFO_EXTENSION ), array( 'php', 'js', 'css' ) ) )
{
$file = str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object );
if ( isset( $array_file_hash[$file] ) )
{
if ( $array_file_hash[$file] != md5_file( $object ) ) {
echo 'File: <b style="color: red"> '.$file.'</b><br />';
}
}
}
}
}
}
}
checking_files( $_SERVER['DOCUMENT_ROOT'] );
Данные примеры служат только инструкцией для понимания работы проверки целостности ваших файлов. Но после небольших их изменениях, можно создать очень мощный инструмент для защиты Web ресурса.

Добавить комментарий

Имя:
Текст комментария: