// Аналог функции gethostbyaddr(), но всегда проверяет,
// не подменил ли злоумышленник по адресу $ip имя своего
// хоста на чужое. В последнем случае просто возвращает false.
function safe_gethostbyaddr($ip)
{ // Получаем предполагаемое имя
$host=gethostbyaddr($ip);
// Адреса не существует? Не фатально — вернем то, что есть.
if($host==$ip) return $host;
// Теперь спрашиваем $host, кто он такой.
$check_ips=gethostbynamel($host);
// Есть ли среди адресов, которые он вернул, затребованный?
foreach($check_ips as $check_ip) {
// Если нашли, то $host достоверен — возвращаем его.
if($ip==$check_ip) return $host;
}
// Иначе, если ни один адрес не совпал, выходим
return false;
}
// Теперь посмотрим, что из себя представляет наш адрес...
echo safe_gethostbyaddr("195.84.12.34");
?>
Вот теперь все будет работать корректно. Однако за все приходится платить: safe_gethostbyaddr()
требует гораздо больших затрат времени, чем gethostbyaddr(), потому что нам приходится дополнительно обращаться еще как минимум к одной машине. Если безопасность для вас важнее, чем какие-то пара секунд простоя, используйте safe_gethostbyaddr().