Как использовать 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
:
В результате получим
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
:
На моём компьютере ответ был таким:
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
:
Результат:
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 минут), проверяющего черные списки:
<?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,
Админ, слушай, я давно хотел спросить что за дизайн это? Уникальный или паблик, хочу что-то типа такого на свой хип-хоп сайт
Самописный в свободное от работы время.