САМОУЧИТЕЛЬ PHP 4

Корректный перевод IP-адреса в доменное имя


Функция gethostbyaddr()

на первый взгляд проста и привлекательна, но с ней связан один нюанс, который до недавнего времени было принято игнорировать. Дело в том, что при поиске доменного имени машины по заданному IP-адресу PHP обращается к хосту по этому адресу и запрашивает у него доменное имя. Если хостом владеет злоумышленник, он может перехватить эту операцию и возвратить вам все, что ему (а не вам) будет угодно!

Рассмотрим это на примере. Пусть вам надо определить доменное имя компьютера, расположенного по адресу 195.84.12.34.

Давайте предположим, что эта машина принадлежит симпатичному[DK149] хакеру, который настроил свой DNS-сервер так, чтобы он говорил: "Я являюсь хостом whitehouse.gov", если его об этом спросят по адресу 195.84.12.34. Так что, выполнив код:

echo gethostbyaddr("195.84.12.34");

мы получим вывод whilehouse.gov.

Произошла подмена!

Как же нам быть? А вот как. Предположим, мы получили от хоста с некоторым IP-адресом

информацию, что его "зовут" whitehouse.gov. Обратимся же к нему и получим его IP-адрес, а потом сравним, тот ли это адрес, который мы запрашивали вначале:

$ip="195.84.12.34";

$host=gethostbyaddr($ip);

// Если была ошибка, $host==$ip

if($host==$ip) die("Неверный ip-адрес $ip!");

$check_ip=gethostbyname($host);

// Если была ошибка, $check_ip==$host

if($check_ip==$host) die("Неверное доменное имя $host!");

// Ну вот, теперь сверяем данные

if($ip==$check_ip)

  echo "По адресу $ip расположен хост $host";

else

  echo "По адресу $ip расположен хост злоумышленника!!!";

Длинно? Да. Но это еще, к сожалению, не все. Ведь у одного и того же доменного имени могут быть сразу несколько IP-адресов. Нас устроит, если хотя бы один из них совпадет с затребованным нами. Так что придется воспользоваться функцией gethostbynamel()

и циклом перебора списка IP-адресов. Вот что у нас получится:

Листинг 27.2. Безопасная функция получения доменного имени

<?



Содержание раздела