Что такое IP-адрес и для чего он
нужен вебмастеру? IP-адрес представляет собой уникальный 32-х битный
идентификатор компьютеров, состоящий из четырех десятичных чисел, разделенных
точками, например, 127.0.0.2. Взаимодействие или обращение к
определенному компьютеру в Интернете осуществляется по его IP-адресу.
В идеале каждый компьютер, с которого пользователь запрашивает страницы сайта,
имеет постоянный уникальный IP-адрес, который, в свою очередь,
передается серверу при запросах. На практике это не всегда так. Иногда нельзя
отличить разных пользователей, работающих через один прокси-сервер
по IP-адресам, т.к. в HTTP заголовках передается IP-адреспрокси-сервера, а не конкретного пользователя.
Отслеживание IP-адресов посетителей страницы или
сайта позволяет определять новых и старых пользователей, т.е. повторные и
новые визиты. В свою очередь эта информация может быть использована для решения
различных практических задач, таких как, например, создание счетчиков посещения
сайта, ограничение повторного участия в голосовании и т.п. Таким образом,
определение IP-адреса является задачей, решение которой открывает
массу полезных возможностей для вебмастера.
Переменные окружения CGI и доступ к ним в Perl
При запросе пользователем веб-страницы с сервера браузер посылает
ему запрос по протоколу HTTP. Запрос браузера в соответствии с протоколом
всегда содержит заголовок. В заголовке содержится имя запрашиваемого файла,
путь к нему, версия протокола HTTP и, что наиболее интересно для нас, информация
о пользователе, включая IP-адрес. В сценарии, написанном на языке
Perl, эта информация доступна через ассоциативный массив (хеш) %ENV.
Некоторые переменные окружения, используемые для идентификации пользователя,
и их значения представлены в таблице 1.
Таблица 1
Имена и значения некоторых переменных
окружения, используемых для идентификации пользователя
Имя переменной окружения
Значение переменной
HTTP_COOKIE
Записанные в браузере cookie для данного URL
HTTP_X_FORWARDED_FOR
IP-адрес клиента при подключении
через прокси
REMOTE_ADDR
Удаленный IP-адрес клиента
REMOTE_HOST
Имя удаленного узла, осуществляющего запрос
Для того, чтобы получить доступ к значению переменной окружения
с помощью Perl необходимо просто использовать в качестве ключа в хеше %ENV
имя этой переменной. Например, удаленный IP-адрес клиента можно
получить, используя в хеше имя REMOTE_ADDR и ,соответственно, запись
$ENV{ REMOTE_ADDR }.
Значения всех переменных окружения, доступных через хеш %ENV,
можно получить, воспользовавшись простым скриптом:
#!/usr/local/bin/perl ## если perl в другом каталоге - #!/usr/bin/perl print "Content-type: text/html\n\n"; ## перебираем все ключи хеша и для каждого ## выводим запись "ключ" - "значение" foreach $key( keys( %ENV ) ) { print "$key - $ENV{ $key }<br>\n"; }
Запись IP-адреса в скалярную переменную
Последняя тонкость, которую нужно знать для определения IP-адреса
на Perl, состоит в том, что при подключении пользователя через прокси-сервер,
в переменной $ENV{ REMOTE_ADDR } будет храниться его IP-адрес,
а не IP-адрес пользователя. Как указано в таблице
1, IP-адрес клиента при подключении через прокси находится
в переменной $ENV{ HTTP_X_FORWARDED_FOR }. Теперь мы уже знаем все
необходимое для определения IP-адреса на Perl. Все что осталось
-- это написать соответствующий код:
## если ключ HTTP_X_FORWARDED_FOR определен if ( $ENV{ HTTP_X_FORWARDED_FOR } ) { ## в переменную $ip записывается IP-адрес ## клиента, подключенного через прокси $ip = $ENV{ HTTP_X_FORWARDED_FOR}; } else { ## в противном случае запишем в $ip ## удаленный IP-адрес клиента $ip = $ENV{ REMOTE_ADDR }; }
Согласно этому программному коду в переменную $ip записывается
IP-адрес клиента при подключении через прокси или удаленный IP-адрес,
если подключение идет не через прокси.
Пример использования IP-адреса для
учета повторных визитов
Ниже приведен программный код cgi скрипта на языке Perl, осуществляющий проверку
повторных визитов. В том случае, если осуществлен первый визит будет выдано
приветствие 'Вы здесь впервые!', а если визит повторный -- 'Вы
здесь уже были!'. IP-адреса машин, с которых уже осуществлялись
визиты, записываются в файл ip_base на сервере.
#!/usr/local/bin/perl ## записываем IP-адрес в переменную $ip if ( $ENV{ HTTP_X_FORWARDED_FOR } ) { $ip = $ENV{ HTTP_X_FORWARDED_FOR }; } else { $ip = $ENV{ REMOTE_ADDR }; } $path_to_file = "ip_base"; $comment = "Вы здесь в первый раз!" ## открываем файл ip_base и ищем в нем ## IP-адрес из переменной $ip open ( IP_BASE, "$path_to_file" ); while ( <IP_BASE> ) { if ( /$ip/ ) { $comment = "Вы здесь уже были!"; } } close ( IP_BASE ); ## записываем в файл ip_base новый IP-адрес ## если пользователь здесь впервые if ( $comment eq 'Вы здесь в первый раз!' ) { open ( ADD_IP, ">>$file" ); print ADD_IP "$ip\n"; close ( ADD_IP ); } ## Выводим html файл с комментарием print "Content-type: text/html\n\n"; print "<h1>$comment</h1>";