Sollte ich eine DNSBL Web-Datenverkehr zu blockieren Spammer überprüfen?
-
28-09-2019 - |
Frage
Anstatt ausschließlich Spam mit CAPTCHAs und Spam-Kommentar Kontrolleure abwehren - ist es eine gute Idee, überprüfen jede Anfrage gegen einen DNSBL und den Benutzer sperren, wenn sie ein verwenden schlechte IP?
$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');
}
}
Es scheint, wie die einzigen Probleme wären übereifriger IP guten Benutzer durch die DNSBL Sperrung oder die groß Kosten für die Herstellung eines DNS-Lookup jede Anforderung.
Lösung
Dies könnte helfen, aber Sie werden zwei Dinge zu berücksichtigen haben. Fehlalarme und falsch negative Ergebnisse
DNSBLs sind im Allgemeinen recht einige beides. Fehlalarme, die ahnungslosen Anwender getroffen, und False Negatives, die guten Stücke von Botnets verpassen. Die beste Lösung, die ich habe online für den Umgang mit Spam gefunden, ist die Verwendung CAPTCHAs.
Andere Tipps
Das Nachschlagen Sie tun durch die Art und Weise es nicht genug ist, sollten Sie unten anstatt mit so etwas wie den Code betrachten. Außerdem unterstützt dieser Code auch die Art von IPv6-Lösung, dass dnsbl.tornevall.org unterstützt.
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)));
}