Определение IP-адреса с помощью Perl

Автор: Topol Вторник, Апрель 17th, 2012 Нет комментариев

Рубрика: Программирование

Что такое 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 }
\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<»;

Источник: woweb.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты