2010-11-28 4 views
1

Вместо того, чтобы полностью бороться со спамом с помощью CAPTCHA и спам-комментаторов - это хорошая идея для check each request против DNSBL и заблокировать пользователя, если они используют плохой IP-адрес?Должен ли я использовать DNSBL для проверки веб-трафика для блокировки спамеров?

$blacklists = array('web.sorbs.net', 'opm.tornevall.org'); 
$parts = explode('.', $_SERVER['REMOTE_ADDR']); 
$ip = implode('.', array_reverse($parts)) . '.'; 
foreach($blacklists as $bl) 
{ 
    $check = $ip . $bl; 
    if ($check != gethostbyname($check)) 
    { 
     error_log('PHP Security: [DNSBL] - ' . $_SERVER['REMOTE_ADDR'] . ' - ' . $bl); 
     die('Put a detailed error here so the client knows why they have been blocked'); 
    } 
} 

Похоже, единственные проблемы были бы чрезмерно усердствовать IP блокирование хороших пользователей к DNSBL или большой стоимости изготовления DNS поиск каждый запрос.

ответ

0

Это может помочь, но вам придется принять во внимание две вещи: ложные положительные и ложные негативы.

DNSBLs имеют тенденцию иметь довольно много из обоих. Ложные Положительные эффекты, которые поражают невинных пользователей, и False Negatives, которые будут пропускать хорошие куски бот-сетей. Лучшее решение, которое я нашел для работы со спамом в Интернете, - это использовать CAPTCHA.

+1

Ну, если вы не можете положиться на это для своей основной защиты - что, если вы проверили несколько DNSBL и только заблокировали доступ, если данный IP был на всех из них. Это может помочь остановить ложные положительные результаты, а остальные меры защиты от спама могут помочь с ложными негативами. Звучит разумно? – Xeoncross 2010-11-28 19:04:59

1

Поиск, который вы делаете, к сожалению, недостаточно, вы должны использовать вместо него что-то вроде кода ниже. Кроме того, этот код также поддерживает вид ipv6-разрешения, поддерживаемый dnsbl.tornevall.org.

function rblresolve ($ip = '', $rbldomain = '') 
{ 
    if (!$ip) {return false;}      // No data should return nothing 
    if (!$rbldomain) {return false;}  // No rbl = ignore 

    // New ipv6-compatible function 
    $returnthis = (long2ip(ip2long($ip)) != "0.0.0.0" ? explode('.', gethostbyname(implode('.', array_reverse(explode('.', $ip))) . '.' . $rbldomain)) : explode(".", gethostbyname(v6arpa($ip) . "." . $rbldomain))); 
    // 127-bug-checking 
    if (implode(".", $returnthis) != (long2ip(ip2long($ip)) != "0.0.0.0" ? implode('.', array_reverse(explode('.', $ip))) . '.' . $rbldomain : v6arpa($ip) . "." . $rbldomain)) {return $returnthis;} else {return false;} 
} 
function v6arpa($ip) 
{ 
    $unpack = unpack('H*hex', inet_pton($ip)); 
    $hex = $unpack['hex']; 
    return implode('', array_reverse(str_split($hex))); 
}