Я думаю не нужно рассказывать, что такое спамеры и как они часто густо гадят на сайтах и форумах?!:) Сегодня будем прикручивать 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 подавляется символом @:
Поэтому PEAR NET_DNSBL может не работать из-за невозможности подключить PHP расширение, при этом не выдавая никаких ошибок PHP!
Для подтверждения своих опасений в неработоспособности предварительно проверьте ИП по Blocklist Removal Center - The Spamhaus Project и CBL Lookup Utility