Web - кодинг: Perl:
Определение IP-адреса с помощью Perl
Источник:
Что такое 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>$comm
|