Простейшая фильтрация входящих данных, must have для любого сайта на php везде и всегда.
Стоит уделить совсем немного времени ДО того, как сайт пострадает от вирусных проблем, чем потом долго и нудно чистить его, двигаясь по пунктам бесконечной и мудреной инструкции.
1. Узнайте абсолютный путь к папке сайта. Для этого положите в папку сайта файл с длиннейшим абракадаберным названием, например Ndjcwi-JDsw783hgS-QG_QGW.php
, со следующим содержанием:
<?php
echo $_SERVER['DOCUMENT_ROOT'];
?>
Затем перейдите по ссылке http://ваш_сайт/Ndjcwi-JDsw783hgS-QG_QGW.php
Отобразится что-то вроде /var/www/vhosts/moysait/httpdocs/
– это и будет абсолютный путь к папке сайта. Запишите себе этот путь, и удалите наш абракадаберный файл.
2. Создайте папку filter
на уровень выше чем папка сайта, она должна быть рядом с папкой сайта. И положите в эту папку файл prfilter.php
следующего содержания:
<?php
$patt = "~\<\?~i";
if (is_array($_FILES)) {
foreach($_FILES as $anystring=>$file_data) {
if (preg_match($patt,file_get_contents($file_data['tmp_name']))) die("denied by antivirus-alarm 3");
}
}
$patt = "~\/\.\.\/\.\.\/\.\.\/|{0-9a-zA-Z}[80]|eval[^\(]*\(|include[^\(]*\(|base64_decode[^\(]*\(|stripslashes[^\(]*\(|strip_tags[^\(]*\(|fopen[^\(]*\(|chmod[^\(]*\(|chown[^\(]*\(|chgrp[^\(]*\(|unlink[^\(]*\(|unset[^\(]*\(|fgetc[^\(]*\(|fgets[^\(]*\(|file_get_contents[^\(]*\(|file_put_contents[^\(]*\(|fwrite[^\(]*\(|move_uploaded_file[^\(]*\(|is_uploaded_file[^\(]*\(|rmdir[^\(]*\(|fromCharCode[^\(]*\(|tmpfile[^\(]*\(|tempnam[^\(]*\(|phpinfo[^\(]*\(|basename[^\(]*\(|curl_init[^\(]*\(|socket_create[^\(]*\(|popen[^\(]*\(|exec[^\(]*\(|system[^\(]*\(|passthru[^\(]*\(|proc_open[^\(]*\(|gzuncompress[^\(]*\(|shell_exec[^\(]*\(|delete from|insert into~i";
foreach ($_REQUEST as $v1x1) prfilter_x1($v1x1,$patt);
function prfilter_x1($v1x1,$patt) {
ob_start();
if (is_array($v1x1)) {
foreach ($v1x1 as $vx) prfilter_x1($vx,$patt);
}
else {
if ( preg_match($patt, $v1x1) || preg_match($patt, stripslashes($v1x1) ) ) die("denied by antivirus-alarm 1");
if ( preg_match($patt, base64_decode($v1x1) ) || preg_match($patt, stripslashes(base64_decode($v1x1) ) ) ) die("denied by antivirus-alarm 2");
}
ob_end_clean();
}
?>
3. Откройте файл .htaccess лежащий у вас в корне сайта, и добавьте вверху строку:
php_value auto_prepend_file /var/www/vhosts/moysait/filter/prfilter.php
Вместо /var/www/vhosts/moysait/httpdocs/
надо, конечно, поставить свой абсолютный путь, который мы выясняли в п.1
4. Проверяем, теперь по адресу http://ваш_сайт/?x=eval()
должно быть сообщение: "denied_by antivirus-alarm 1". Также смотрим по http://ваш_сайт/
– всё должно работать по прежнему.
5. Если при работе в админке сайта вам не к месту выдается сообщение "denied_by antivirus-alarm" – обратитесь к своему вебмастеру или программисту, чтобы подкорректировать фильтр для вашего конкретного случая. Не отключайте фильтр, обзательно используйте его постоянно – он защищает ваш сайт не только от известных угроз, но и от тех, что могут появиться в будущем.
- Также рекомендуется:
- Делать резервное копирование сайта самостоятельно, а также следить за тем, что хостеры его тоже делают;
- Отказаться от использования
FTP
, использовать толькоSFTP
; - Если ваш хостер не предоставляет вам
SSH
доступ к сайту, и вы из-за этого не можете делать бэкапы самостоятельно, и не может использоватьSFTP
– поменяйте хостера; - Используйте лицензионные и только лицензионные
CMS
для своего сайта. Не обязательно платные; - Следите за выходом новостей и заплаток для вашей
CMS
на официальном сайте поддержки этойCMS
; - Скачивайте архив для установки
CMS
и любых плагинов только с официальных сайтов, и следите за новостями об уязвимости этих плагинов; - Если у вас используются утилиты наподобие
phpMyAdmin
, помещайте их в папки с неочевидными, лучше всего длинными и абракадаберными названиями, наподобиеwfqmwkmuSKIwefuihDksdjf
– это препятствует их нашариванию; - Ограничивайте доступ к админке сайта, утилитам, наподобие
phpMyAdmin
и другим инструментам управления сайтом, поip
; - Используте очень длинные, абракадаберные и полные кракозябликов пароли, наподобие
447duIDJfwIW0112ShdsQ_Q_WAED--^kasjG7QAQ
; - Храните пароли в текстовом или вордовском файле, а не в "запоминалке" паролей вашего броузера или файловой программы.
Комментарии:
Николай#
А кто делает именно этот скрипт? не пускает вирус или как
coder.hol.es /* Админ */#
Он не позволяет выполнять опасные запросы/обращения к сайту по любым методам (POST, GET, HEAD и т.д.), даже если исходный код сайта содержит уязвимости. И если у желающих взломать/внедрить что в сайт нет доступа/паролей к вашему серверу/сайту/БД (админка, ftp, ssh и т.д.), то обеспечивает эффективную защиту, типа firewalla. Конечно, он не лечит, но его стоит ставить и при зараженном сайте и лечении. Подробнее по лечению: Удалить вирус с сайта самостоятельно http://coderhs.com/archive/delete_virus
Dzmitry Roshchyn#
Огромная благодарность автору, установил по инструкции, все работает.
coder.hol.es /* Админ */#
Вам благодарность за добрые слова) – авторство принадлежит источнику (кнопка "Источник" внизу материала).
grbit#
У меня просто слов нет, нашёл эту штуку на сайте у клиента. Он тоже жаловался что картинки не загружают. Руки надо отрывать за такие проверки
картинок, проверять из на такое это дебилизм, уж простите меня. Человек кроме всего поставил флаг caseless, т.е. одинаковая чувствительность к большим и маленьким буквам, при том что в регулярке вообще букв нет. Только абсолютно безмозглый человек может так проверять загружаемые файлы. Стоит отключить на сервере short_open_tag а проверку исправить хотя бы на такуюБЛЖАД!!11!#"!;
Такая регулярка"\<\?~i"
сработает положительно на 90"~\<\?php[ a-zA-Z0-9]{5}"
и то я думаю ложные срабатывания будут