
Простейшая фильтрация входящих данных, must have для любого сайта на php везде и всегда.
Стоит уделить совсем немного времени ДО того, как сайт пострадает от вирусных проблем, чем потом долго и нудно чистить его, двигаясь по пунктам бесконечной и мудреной инструкции.
1. Узнайте абсолютный путь к папке сайта. Для этого положите в папку сайта файл с длиннейшим абракадаберным названием, например ololo.php
, со следующим содержанием:
1 |
<?php echo $_SERVER['DOCUMENT_ROOT']; ?> |
Затем перейдите по ссылке http://ваш_сайт/ololo.php
Отобразится что-то вроде /var/www/vhosts/moysait/httpdocs/
– это и будет абсолютный путь к папке сайта. Запишите себе этот путь, и удалите наш абракадаберный файл.
2. Создайте папку filter
на уровень выше чем папка сайта, она должна быть рядом с папкой сайта. И положите в эту папку файл prfilter.php
следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?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» – обратитесь к своему вебмастеру или программисту, чтобы подкорректировать фильтр для вашего конкретного случая. Не отключайте фильтр, обязательно используйте его постоянно – он защищает ваш сайт не только от известных угроз, но и от тех, что могут появиться в будущем.
Все права на статью принадлежат
UPD: От себя добавлю, в таком виде защита работает, но практически ничего не даёт сделать на сайте. Нужно доработать напильником.
Комментарии: