DyaDya

DyaDya
Рейтинг
147
Регистрация
11.04.2007

Решил свой тоже положить, как то пришлось написать, когда хостинг заразили.

patches.php


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>УТИЛИТА: проверка на вирусные включения...</title>
</head>
<body>
<?php
#
#$check_only==true, значит делаем только проверку на вхождения. Изменения не делаем!
$check_only=true;
#$show_patches_only==true, в броузер выводим только то, что требует лечения.
$show_patches_only=true;
#зловредный код, ищем его.
#$pattern = "'<!--\[I\]-->.*?<!--\[/I\]-->'si";
$pattern = "'<!--\[z0s\]-->.*?<!--\[/z0s\]-->'si";

#указываем начальное время.
$fromdate=mktime(1, 0, 0, 9, 21, 2007 );
#указать начальную директорию, файл бросаем в корень любого веб сайта.
$fromdir=".";

#список расширений файлов, которые разрешено проверять на вредоносный код
$ext["allowed"]=array("html", "htm", "php", "php3", "txt", "js");



##########################################################################
Function listdir_fromdate($start_dir='.', $dt) {
global $ext;
$files = array();
if (is_dir($start_dir)) {
$fh = opendir($start_dir);
while (($file = readdir($fh)) !== false) {
# loop through the files, skipping . and .., and recursing if necessary
if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue;
$filepath = $start_dir . '/' . $file;
if ( is_dir($filepath) ){
$files = array_merge($files, listdir_fromdate($filepath, $dt));
}
else{
if (filemtime($filepath)>=$dt){
$path_parts = pathinfo($filepath);
if (in_array($path_parts['extension'], $ext["allowed"])){
#echo $path_parts['extension']."<br>";
array_push($files, $filepath);
}
}
}
}
closedir($fh);
} else {
# false if the function was called with an invalid non-directory argument
$files = false;
}
return $files;
}

#проверяем, есть ли искомый код.
Function check_file($filepath) {
global $pattern;
$data=file_get_contents($filepath);
if (preg_match($pattern, $data)){
return true;
}
return false;
}

#лечим файлы.
function patch_file($filepath) {
global $pattern;
if (!is_writable($filepath)){
echo ' Не достаточно прав на запись в файл <b>'.$filepath.'</b><br>';
return false;
}
$replacement = "";
$data=file_get_contents($filepath);
$data=preg_replace($pattern, $replacement, $data);
/*
echo '<pre>';
echo htmlspecialchars($data);
echo '</pre>';
*/
$strlen=strlen($data);
if ($strlen==file_put_contents($filepath, $data)){
#записано столько сколько и передано
return true;
}
else{
echo ' В процессе записи было записано меньше данных. <b>'.$filepath.'</b><br>';
return false;
}
}

if ( !function_exists('file_put_contents')){
define('FILE_APPEND', 1);
function file_put_contents($n, $d, $flag = false) {
$mode = ($flag == FILE_APPEND || strtoupper($flag) == 'FILE_APPEND') ? 'a' : 'w';
$f = @fopen($n, $mode);
if ($f === false) {
return 0;
} else {
if (is_array($d)) $d = implode($d);
$bytes_written = fwrite($f, $d);
fclose($f);
return $bytes_written;
}
}
}
##########################################################################





echo "Выводим все файлы, которые были изменены после <b>".date("H:i:s m.d.Y", $fromdate)."</b><br>";
$files = listdir_fromdate($fromdir, $fromdate);
$cnt=count($files);
$ok=array();#те что были нормальными.
$patches=array();#те что требуют исправлений.
$patches_ok=array();#те что были исправлены.
$patches_errors=array();#те что не смогли исправить.
for ($i=0; $i<$cnt; $i++){
$color="";
if (check_file($files[$i])){
#код найден
$patches[]=$files[$i];
echo '<font color="red">'.($i+1).'. FIND! ['.$files[$i].']</font><br>';
if ($check_only==false){
#только проверяем, но не вносим изменения, если $check_only==1
if (patch_file($files[$i])){
echo '&nbsp;&nbsp;&nbsp;<font color="green">OK! ['.$files[$i].']</font><br>';
$patches_ok[]=$files[$i];
}
else{
echo '&nbsp;&nbsp;&nbsp;<font color="red">ERROR PATCH! '.($i+1).". [".$files[$i].']</font><br>';
$patches_errors[]=$files[$i];
}
}
}
else{
if ($show_patches_only==false){
echo ($i+1).". [".$files[$i].']<br>';
}
$ok[]=$files[$i];
}
}
echo "<br>";
echo "==================================================================<br>";
echo '= Всего файлов найдено: <b>'.$cnt.'</b><br>';
echo '= Не были заражены: <b>'.count($ok).'</b><br>';
echo '= Заражены: <b>'.count($patches).'</b><br>';
echo '=== Заражены и вылечены: <b>'.count($patches_ok).'</b><br>';
echo '=== Заражены, но невылечены: <b>'.count($patches_errors).'</b><br>';
echo "==================================================================<br>";
?>
</body>
</html>

Хотя предудущий пример мне тоже понравился, сразу видно, программист граммотный!!! Но может кому и этот код пригодится.

Кладете в корневую директорию Вашего веб-сервера или любую другую вложенную (приаттачить не получилось, поэтому код прям сюда воткнул, ссори). Прописываете сигнатуру (шаблон) поиска. Запускаете на поиск указанной сигнатуры (предварительно прописать шаблон поиска, можно искать не только вирусы ;) ).

1. Сначала делать в режиме $check_only=true; чтобы просто посмотреть, есть ли вхождения подозрительные.

2. Можно указать дату изменения файлов, которые нужно проверять.

3. Если подозрения есть, то обязательно сделать сначала dump своего сайта!!!

4. Убедиться, что это вирусы и запустить в режиме $check_only=false;

Поиск ведется от текущей директории внуть сайта, рекурсивно.

Удачи, и никому не болеть!!!

ЗЫ. Меня еще удивляет, почему когда заражают, еще и сигнатуры свои приписывают ;)) Похоже, для отчетов перед клиентами!!! что мол столько-то сайтов заражены, платите столько-то!!!

str_replace("<br />", "", Read ($urlmas[$id]))

Да, похоже, ТС причем ;)

У меня вот на некоторых хостингах проблема с FCKEditor, он некоторые символы в кодировке win1251 заменяет на спецсимволы, например, "в", "." и некоторые другие... Тоже бьюсь... Причем, на некоторых хостингах нормально. Проблемы на хостинге у www.nic.ru

Думаю, идея неплохая.

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

Я, например, ни разу не видел, чтобы нормальные сайты инфу прятали о домене. Кто такие знает, скиньте в личку.

ЗЫ. вот сделать бы деление на А, Б, С, но только для этого нужно определить точные критерии распределения сайтов по категориям-качества, а это, пожалуй, и есть самая основная проблема. Предложите точную методику определения качества сайта... Думаю, есть над чем подумать. Только это нужно в отдельный топик вынести.

1. Если есть силы, энтузиазм, знания и средства, то я всегда за РАЗВИВАТЬ!

2. Но если развить шансов нет, то тогда остается только либо ПРОДАТЬ либо просто, оставить до лучших времен ;(

Киньте в личку ссылочки, пасиб...

ЗЫ. Прикольная игра слов: .gov сайты

;)

powers:
контакт есть.

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

Ну так язл и есть направление ;)

Чем точнее расчет нужен, тем глубже и ДОЛЬШЕ нужно копать. Правда, зачем копать глубоко и долго, если все равно ваши РЕАЛЬНЫЕ затраты на продвижение могут отличаться на порядок от расчетов ;) и причем далеко не факт, что именно в меньшую сторону!!!

Попробуйте воспользоваться поверхностной оценкой с помощью эмпирическими формул, типа как у Ашманова... "вспомнить бы ссылочку".

ЗЫ. Плюс запробуйте воспользоваться "Я Злом" ночью, может нагрузка на него поменьше будет и побыстрее сработает. Или тематику выберите менее конкурентную, в которой сайты в выдаче будут с минимальным числом бэков ;).

Риск должен быть оправдан как и для заказчика так и для исполнителя.

Но долги до 80к, пожалуй, не надо доводить, а раз продолжали сотрудничать, значит, надеялись на хороший куш и затраты реально были на порядки ниже!

yton:
Уважаемое сообщество,

Какие могут быть объективные причины в невозможности применения 301 редиректа (сайт работает с www - без www не пашет)

?

спасибо

Причины бывают всякие. Но вам о них, думаю, пока рано думать.

Пишите в службу поддержки хостинга, они должны сделать так, чтобы и с www и без www сайт нормально открывался (у нормальных хостеров - это по умолчанию!).

Несколько минут - это 3-5 минут, думаю врядли за это время кто-то сделает ;) и прикрутит сразу к сайту. Только вопросы некоторые нужно будет уточнять минут 15 ;)

1. AJAX - всего лишь позволяет, не перезгружая страницы, отравлять запросы/данные серверу и получать ответ (конечно я утрирую сильно, но смысл примерно такой).

2. На сервере уже будет скрипт, PHP или ASP это уж смотря на чем сайт. Он обработает запрос, вышлет на мыло нужное уведомление и отправить ответ посетителю сайта.

"Знал бы... тИЦ, жил бы в Сочи."

(сеопреферанс)

Кто бы поделился методикой подсчета и коэффициентом передачи тИЦ? ;)

Кто-нибудь, вообще, наблюдал вообще увеличение тИЦ больше, чем на 10 при поимении одной ссылки с ресурса с высоким тИЦ???

Всего: 2917