Как использовать DNS Blacklist для помещения комментариев в очередь на модерирование
Как-то на досуге я занялся анализом приходящего спама и обратил внимание, что практически 98% спама в комментариях приходят с IP-адресов, замеченных в рассылке спама по электронной почте. А спамеры обычно попадают в черные списки (blacklist).
DNSBL — DNS blacklist или DNS blocklist — списки хостов, хранимые с использованием системы архитектуры DNS. Обычно используются для борьбы со спамом. Почтовый сервер обращается к DNSBL, и проверят в нём наличие IP-адреса клиента, с которого он принимает сообщение. При положительном ответе считается, что происходит попытка приёма спам-сообщения, и оно блокируется (не принимается сервером, и, как правило, отправителю отсылается уведомление об этом).
Идея состоит в том, чтобы написать расширение для WordPress, проверяющее наличие IP-адреса комментатора в чёрном списке.
Есть два (интересующих в данный момент) типа DNSBL: LHSBL (Left Hand Side Blacklist) и RHSBL (Right Hand Side Blacklist). Основная разница в том, что в LHSBL проверяются IP-адреса, а в RHSBL проверяются доменные имена.
Проверка адреса в LHSBL
Пусть, например, имеется IP-адрес 62.85.45.84 (спамер, привет!). Допустим, мы хотим его проверить в списке dnsbl-3.uceprotect.net.
Для этого мы "обращаем" IP-адрес (то есть из 62.85.45.84 делаем 84.45.85.62) и добавляем его к имени хоста списка. в результате получим имя 84.45.85.62.dnsbl-3.uceprotect.net.
В PHP проверку можно сделать, например, при помощи функции gethostbyname(). Для простоты можно выполнить запрос и при помощи утилиты host:
host -t any 84.45.85.62.dnsbl-3.uceprotect.net
В результате получим
84.45.85.62.dnsbl-3.uceprotect.net has address 127.0.0.2
Когда возвращается адрес 127.0.0.0/8, это означает, что адрес в черном списке (конкретное значение зависит от самого списка; например, 127.0.0.2 может означать открытый релей, 127.0.0.3 — открытый прокси-сервер и т.п.).
Если же возвращается ошибка NXDOMAIN (несуществующий домен), адрес не в черном списке.
В Windows, где утилиты host нет (поправьте меня, если ошибаюсь), проверку можно выполнить утилитой nslookup:
nslookup 84.45.85.62.dnsbl-3.uceprotect.net
На моём компьютере ответ был таким:
Server: 10.10.0.15 Address: 10.10.0.15#53 Non-authoritative answer: Name: 84.45.85.62.dnsbl-3.uceprotect.net Address: 127.0.0.2
Проверка адреса в RHSBL
Проверка в RHSBL аналогична проверке в LHSBL; разница состоит в том, что вместо IP-адреса проверяется доменное имя.
Например, если мы хотим проверить oardo.com (Дэвид, привет!) в списке multi.surbl.org, нам нужно проверить существование имени (записи A или AAAA) oardo.com.multi.surbl.org:
host -t any oardo.com.multi.surbl.org
Результат:
oardo.com.multi.surbl.org descriptive text "Blocked, oardo.com on lists [ob], See: http://www.surbl.org/lists.html" oardo.com.multi.surbl.org has address 127.0.0.16
Аналогично, если запись не в черном списке, возвращается NXDOMAIN.
Пример очень простого скрипта на PHP (на коленке за 5 минут), проверяющего черные списки:
<pre> <?php $lhsbls = array( 'dnsbl.ahbl.org', 'dnsbl.isoc.bg', 'cbl.abuseat.org', 'bl.csma.biz', 'list.dsbl.org', 'bl.emailbasura.org', 'dnsbl-1.uceprotect.net', 'dnsbl-2.uceprotect.net', 'dnsbl-3.uceprotect.net', 'zen.spamhaus.org', 'bl.spamcop.net', 'bl.spamcannibal.org', 'dnsbl.sorbs.net', 'dnsbl.rangers.eu.org', 'psbl.surriel.com', 'combined.rbl.msrbl.net', 'noptr.spamrats.com', 'zombie.dnsbl.sorbs.net', 'badconf.rhsbl.sorbs.net', 'dyna.spamrats.com', 'intercept.datapacket.net', 'blacklist.hostkarma.com', 'postmaster.rfc-ignorant.org', 'abuse.rfc-ignorant.org', 'whois.rfc-ignorant.org', 'bogusmx.rfc-ignorant.org', ); $rhsbls = array( 'abuse.rfc-ignorant.org', 'bogusmx.rfc-ignorant.org', 'dsn.rfc-ignorant.org', 'dynamic.rhs.mailpolice.com', 'l1.apews.org', 'multi.surbl.org', 'multi.uribl.com', 'postmaster.rfc-ignorant.org', 'rddn.dnsbl.net.au', 'rhsbl.ahbl.org', 'rhsbl.sorbs.net', 'webmail.rhs.mailpolice.com', ); $ip = 'IP ADDRESS HERE'; $host = gethostbyaddr($ip); $rev = preg_replace('/^(\\d+)\.(\\d+)\.(\\d+)\.(\\d+)$/', '$4.$3.$2.$1', $ip); foreach ($lhsbls as $entry) { print "Querying {$entry}..."; $res = gethostbyname($rev . '.' . $entry); print $res . "\n"; } print "\n\n{$host}\n\n"; foreach ($rhsbls as $entry) { print "Querying {$entry}..."; $res = gethostbyname($host . '.' . $entry); print $res . "\n"; } ?>
Будет время, нужно будет попробовать написать плагин для WordPress…


Hi, Your Site is Very Informative, Thanks
oyfNJ, or whosoever you are (I guess you are a spam bot, but anyway)… All offtopic and spam links are ruthlessly killed by the Spam Recognition System, our secret weapon
So don’t waste your time
I remember one wise man saying,