PHP защита от спамеров на базе PEAR Net_DNSBL

archive view archive save

PHP защита от спамеров на базе PEAR Net_DNSBL Я думаю не нужно рассказывать, что такое спамеры и как они часто густо гадят на сайтах и форумах?!:) Сегодня будем прикручивать PHP защиту от спамеров на базе PEAR Net_DNSBL. API от stopforumspam.com не всегда актуально...

Раньше использовали API от stopforumspam.com но, с недавних пор в ответ на запросы получаем "форбайден":), т.е. API returning 403 Forbidden и соответственно ошибку обработки данных с предупреждением:Warning: Invalid argument supplied for foreach() in /home/public_html/forum/mainlib/StopForumSpam/stopforumspam.php on line 98

Это происходит потому, что на stopforumspam.com решили запретить доступ для некоторых ИП, например при помощи .htaccess, в связи с чем для некоторых закончилась шара по проверке ИП на спам через stopforumspam.com но, это мы не станем унывать и пойдём другим путём.

Наступило время познакомиться с PEAR пакетом Net_DNSBL. PEAR пакет Net_DNSBL предназначен для проверки ИП на его наличие в БД DNSBL/RBL/SURBL в режиме реального времени.

Dependencies for Net_DNSBL

Создадим каталог Net_DNSBL и поместим туда сам PEAR и требуемые PEAR пакеты, должна получится структура:

\Net_DNSBL
    \Cache
    \HTTP
    \Net
    .htaccess
    checkbl.php
    PEAR.php
    PEAR5.php

В каталоге \Cache PEAR пакет Cache_Lite 1.4.1, в \HTTP HTTP_Request2 2.0.0, в \Net PEAR пакеты Net_DNS 1.0.0 и сам Net_DNSBL, .htaccess не обязательно, checkbl.php скрипт, через который будут идти запросы на проверку ИП, PEAR.php и PEAR5.php сам PEAR собственно. \Cache и \HTTP не являются обязательными но, выполняя требования "Dependencies for Net_DNSBL" зависимостей желательно включить их в состав, на всяк случай!

Пример использования Net_DNSBL описан на странице мануала по этому пакету: Manual :: Introduction to Net_DNSBL. Скрипт checkbl.php будет принимать ИП через $_GET параметр, а поэтому пример с мана немного подшаманим и получим:

<?php 
 
require_once 'Net/DNSBL.php';
 
if(!empty($_GET['ip']))
{
    $dnsbl = new Net_DNSBL();
    // Set BL server list
    $dnsbl->setBlacklists(array(
        'xbl.spamhaus.org', 'zen.spamhaus.org', 'sbl-xbl.spamhaus.org', 
        'bl.spamcop.net'
    ));
    // BL: '199.48.147.40'
    // $remoteIP = $_SERVER['REMOTE_ADDR'];
    $remoteIP = $_GET['ip'];
    // http://remotehelp.pp.ua/Net_DNSBL/checkbl.php?ip=199.48.147.40
    if ($dnsbl->isListed($remoteIP))
    {
        // do something
        echo "yes";
    }
    else
    {
        echo "no";
    }
}

ИП 199.48.147.40 находится в DNSBL и его можно использовать для проверки работоспособности скрипта. Обращаться по адресу http://remotehelp.pp.ua/Net_DNSBL/checkbl.php?ip=199.48.147.40 бесполезно, там вас ждёт "форбайден":), 403 Forbidden.

На раз-два мы создали такой себе сервис по проверке ИП на его наличие в DNSBL. Дальше, на том хосте/сайте, на котором будем проверять ИП посетителей, достаточно создать небольшой скрипт config.php, который будет обращаться к нашему checkbl.php:

<?php 
 
// если пришел запрос на регистрацию - ?mode=register
if($_GET['mode'] == 'register')
{
    // начальная конфигурация
    // Установка часового пояса если используется РНР выше 5.1
    // В РНР выше 5.3 не установка часового пояса при использовании
    // функции date() повлечёт ошибку:
    //      Severity: Warning
    //      Message: date(): It is not safe to rely on the system's 
    //      timezone settings. You are *required* to use the date.timezone 
    //      setting or the date_default_timezone_set() function. ....
    if(@!date_default_timezone_set('Europe/Kiev'))
    {
        @ini_set('date.timezone', 'Europe/Kiev');
    }
    // полный путь к каталогу где лежит сей скрипт "config.php"
    $real_path = realpath(dirname(__FILE__));
    // адрес электронной почты для обратной связи.
    $email = '[email protected]';
    $remoteIP = $_SERVER['REMOTE_ADDR'];
 
    $spamcheck = file_get_contents("http://remotehelp.pp.ua/Net_DNSBL/checkbl.php?ip=$remoteIP");
    $spamcheck = trim($spamcheck);
 
    // Если закрыт доступ к сервису.
    switch($spamcheck)
    {
        case 'yes':
            continue;
        case 'no':
            continue;
        default:
            echo 'Spam check error! Maybe service deny connect: 403 Forbidden!';
            exit;
    }
 
    // и если спамер
    if($spamcheck == 'yes')
    {
        // записываем данные о спамере
        if(@$handle = fopen($real_path . '/log/spam-log.txt', "a"))
        {
            @fwrite($handle, $remoteIP . ' - ' 
                    . date("Y:m:d H:i:s", time()) . "\r\n");
            @fclose($handle);
        }
        // включаем шаблон с мессагой
        require_once($real_path . '/tpl/to_spammers.tpl');
        unset($real_path);
        exit;
    }
    unset($real_path);
}

Скрипт config.php поместим в каталог ./mainlib/Net_DNSBL/ относительно корневого каталога форума/сайта и просто будем подключать его с помощью:

require_once('mainlib/Net_DNSBL/config.php');

Понятное дело, что дополнительно нужно будет создать каталоги log и tpl, а также сам to_spammers.tpl шаблон с гневной мессагой для спамера:)

Всё, фенита - PHP защита от спамеров на базе PEAR Net_DNSBL готова к использованию. В качестве BL серверов для проверки ИП на спам, можно использовать BL сервера из приведённого ниже списка:

asiaspam.spamblocked.com
bl.deadbeef.com
bl.emailbasura.org
bl.spamcop.net
blackholes.five-ten-sg.com
blacklist.woody.ch
bogons.cymru.com
cbl.abuseat.org
cdl.anti-spam.org.cn
combined.abuse.ch
combined.rbl.msrbl.net
db.wpbl.info
dnsbl-1.uceprotect.net
dnsbl-2.uceprotect.net
dnsbl-3.uceprotect.net
dnsbl.abuse.ch
dnsbl.ahbl.org
dnsbl.cyberlogic.net
dnsbl.inps.de
dnsbl.njabl.org
dnsbl.sorbs.net
drone.abuse.ch
duinv.aupads.org
dul.dnsbl.sorbs.net
dul.ru
dyna.spamrats.com
dynip.rothen.com
eurospam.spamblocked.com
fl.chickenboner.biz
http.dnsbl.sorbs.net
images.rbl.msrbl.net
ips.backscatterer.org
isps.spamblocked.com
ix.dnsbl.manitu.net
korea.services.net
lacnic.spamblocked.com
misc.dnsbl.sorbs.net
noptr.spamrats.com
ohps.dnsbl.net.au
omrs.dnsbl.net.au
orvedb.aupads.org
osps.dnsbl.net.au
osrs.dnsbl.net.au
owfs.dnsbl.net.au
owps.dnsbl.net.au
pbl.spamhaus.org
phishing.rbl.msrbl.net
probes.dnsbl.net.au
proxy.bl.gweep.ca
proxy.block.transip.nl
psbl.surriel.com
rbl.interserver.net
rdts.dnsbl.net.au
relays.bl.gweep.ca
relays.bl.kundenserver.de
relays.nether.net
residential.block.transip.nl
ricn.dnsbl.net.au
rmst.dnsbl.net.au
sbl.spamhaus.org
short.rbl.jp
smtp.dnsbl.sorbs.net
socks.dnsbl.sorbs.net
spam.dnsbl.sorbs.net
spam.rbl.msrbl.net
spam.spamrats.com
spamlist.or.kr
spamrbl.imp.ch
t3direct.dnsbl.net.au
tor.ahbl.org
tor.dnsbl.sectoor.de
torserver.tor.dnsbl.sectoor.de
ubl.lashback.com
ubl.unsubscore.com
virbl.bit.nl
virus.rbl.jp
virus.rbl.msrbl.net
web.dnsbl.sorbs.net
wormrbl.imp.ch
xbl.spamhaus.org
zen.spamhaus.org

PEAR NET_DNSBL не работает

Бывает и такое, что PEAR NET_DNSBL не работает, при этом не выдавая никаких ошибок PHP. Обычно причиной этому является запрет на использование неких PHP функций или же отсутствие требуемых PHP расширений, дополнительно смотрите вывод phpinfo();, где обратите внимание на disable_functions:

disable_functions system, show_source, exec, shell_exec, proc_open, passthru, 
set_time_limit, ini_restore, mysql_list_dbs, ini_alter, dl, disable_functions, 
openlog, syslog, symlink, link, chgrp, leak, popen, escapeshellcmd, 
apache_child_terminate, apache_get_modules, apache_get_version, apache_getenv, 
apache_note, apache_setenv, virtual, mb_send_mail system, show_source, exec, 
shell_exec, proc_open, passthru, set_time_limit, ini_restore, mysql_list_dbs, 
ini_alter, dl, pfsockopen, openlog, syslog, symlink, link, chgrp, leak, popen, 
escapeshellcmd, apache_child_terminate, apache_get_modules, apache_get_version, 
apache_getenv, apache_note, apache_setenv, virtual, mb_send_mail

Так например в PEAR.php используется PHP функция dl, при использовании которой, вывод ошибок PHP подавляется символом @:

return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);

Поэтому PEAR NET_DNSBL может не работать из-за невозможности подключить PHP расширение, при этом не выдавая никаких ошибок PHP!

Для подтверждения своих опасений в неработоспособности предварительно проверьте ИП по Blocklist Removal Center - The Spamhaus Project и CBL Lookup Utility

Ссылки по теме

Олег Головский


Комментарии в блоге
Новое на форуме