Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #62, ФЕВРАЛЬ 2004 г.

Кто там?! Whois-клиент на php

Никита Кислицин

Xakep, номер #062, стр. 062-122-1


(nikitoz@real.xakep.ru, www.ired.ru)

Тема по созданию своего whois-клиента

В Кодинге были уже, по крайней мере, две статьи про использование сокетов в PHP. Но оба материала были довольно сильно разнесены по логическому уровню работы. Если в одной статье я рассказывал о самых низкоуровневых функциях, типа fsockopen(), то во второй, напротив, мы уже оперировали объектными терминами.

Сегодня мне хотелось бы завершить, наконец, эту тему, связав "низы" с "верхами" - я решил написать клиентскую программу, которая, помимо сетевых функций, будет предоставлять пользователю удобный и расширяемый интерфейс. Для примера возьмем реализацию клиента для whois-сервера. На самом деле, это, конечно, детская задача, но скажи честно, ты знаешь, как это сделать? Если нет (а судя по приходящим письмам, большинство читателей ответили именно так), читай дальше. Знаешь - тоже почитай. Может быть, вынесешь для себя что-то новое :).

Что такое Whois?

Whois - это сетевая служба, предоставляющая интерфейс для доступа к базе данных, содержащей сведения о доменных именах интернета, сетях организаций и ответственных лицах. Все эти бесценные сведения может получить любой желающий, подключившись телнетом на 43 порт Whois-сервера (например, whois.ripe.net) и потребовав интересующую его информацию. Причем запрос, само собой, должен быть составлен в соответствии с семантическими требованиями сервиса. И эти самые требования описаны в соответствующих RFC - они чрезвычайно просты и прозрачны. Так, чтобы запросить сведения о каком-либо домене, следует просто ввести его имя (например, ired.ru). Чтобы выяснить, к сети какой организации относится определенный IP, следует ввести его адрес - например, 194.56.12.11.

Кодим

Ну что же, цель ясна, средства тоже – понеслась :). Первым делом напишем функцию, которая подключится к Whois-узлу, отправит запрос и вернет ответ сервера:

Код отправки запроса

function WhoisQuery($server="whois.ripe.net", $query) {

$data="";

/* Создаем сокет с 43-м портом указанного пользователем узла */

$sp=fsockopen($server, 43);

if(!$sp) {

echo "Не удалось подключиться к сервису Whois!:(<br>\n"; return 0;

}

/* Отправляем запрос */

fputs($sp, $query."\r\n");

while(!feof($sp)) {

/* Читаем в переменную $data данные цугами по 1 Кб */

$data .= fread($sp, 1024); }

fclose($sp);

return $data;

}

Функция принимает два параметра: адрес Whois-сервера и запрос к нему (фактически, IP-адрес или доменное имя). Причем для первого параметра предусмотрено значение по умолчанию - whois.ripe.net. Функция создает соединение с сервером, а в переменную $sp помещается дескриптор на этот сокет. Если же соединиться не удалось, то функция выводит сообщение об ошибке и возвращает 0. В противном случае, программа пишет в сокет запрос, добавляя в его конец последовательность символов "\r\n" - перевод каретки и перенос строки (аналог нажатия клавиши ENTER). Затем блок читает данные из сокета по одному килобайту и дописывает их на каждом проходе в переменную $data (дописывание осуществляется при помощи конструкции ".="). В конце процедуры мы освобождаем память из-под указателя на уже убитый сокет и возвращаем переменную $data. Такая вот процедура. Теперь настал черед создать пользовательский интерфейс для работы с нашей программой. Мне не пришло в голову ничего лучше, чем просто создать поле с запросом, а строчкой ниже вызывать нашу процедуру:

Содержание  Вперед на стр. 062-122-2