Рейтинг блогов

Как узнать страну по IP-адресу?

дата добавления: 17 июля 2006 / 18:16, просмотров: 25119, комментариев: 14
Это перевод статьи автора Amit Gupta с английского языка. Ссылка на оригинал, к сожалению, со временем была утеряна.

 

Введение

 

Интернет широко распространен в большинстве стран и континентов. Узнать страну посетителей вашего веб-сайта может быть не легкой задачей, особенно если вы не знаете как это сделать.

 

Что требуется??

 

Ну, во-первых, возникает вопрос, зачем вам знать в какой стране живут посетители вашего сайта. Причин может быть много. Некоторые из них:

 

  • Что бы показывать рекламу, ориентированную на страну посетителя сайта
  • Вести учет посещения сайта в зависимости от страны.
  • Показывать локализованную версию сайта.
  • Переводить посетителей сайта на локализованный сайт.
  • Показывать продукты и цены в валюте той страны, в которой проживает посетитель сайта.

 

Это только несколько причин. Их может быть гораздо больше. Но думаю, теперь вы точно знаете, зачем вам нужно знать, в какой стране проживают посетители вашего сайта.

 

Как??

 

Теперь вы знаете, зачем вам необходимо знать, в какой стране живут посетители вашего сайта, теперь вопрос, как это сделать? Как вы можете узнать страну, в которой приживают посетители вашего сайта?

 

IP и Страна??

 

Каждый пользователь Интернет имеет уникальный IP-адрес, другими словами, каждый компьютер подключенный к Интернет, имеет уникальный IP-адрес. IP-адрес – это цифровой адрес, ссылающийся на компьютер в сети. Ниже приведен пример обычного IP-адреса: 120.36.162.75


Для каждого ISP (Поставщик Услуг Интернет) распределен определенный диапазон IP-адресов, который провайдер может дать своим пользователям. Таким образом, через IP-адрес, мы можем узнать страну, в которой проживает посетитель нашего сайта.

 

База данных

 

Существует множество бесплатных и коммерческих сервисов предоставляющих данные о географическом положении посетителей вашего сайта. Тем не менее,  мы будем использовать бесплатную базу данных IP-стран с сервера http://ip-to-country.webhosting.info/. Эта база данных доступна в CSV формате и может быть импортирована в любую базу данных, например: MS-Access, MS-SQL, MySQL и т.д. Но мы будем использовать ASP и MS-Access.

 

База данных MS-Access, содержащая загруженные данные из базы данных cvs находится в прикрепленном файле к этой статье. Полный код получения данных находится в конце статьи.

 

И так, после импорта данных из CSV-файла в базу данных MS-Access, мы назовем базу данных ip2country, а таблицу ip2c.

 

Наша таблица ip2c имеет 5 колонок, а именно: ip_from, ip_to, co_code2, co_code3 и co_name.

 

В место IP-адреса в формате xxx.xxx.xxx.xxx эта база данных содержит области IP адреса. Колонка ip_from – начало диапазона, а ip_to - конец. Колонка co_code2 содержит двухзначный код страны, а колонка co_code3 – трехзначный код страны. Колонка co_name содержит полное название страны.

 

Теперь приступим к написанию кода.

 

Кодинг

 

Теперь, когда у нас есть база данных, мы можем приступить к написанию кода.

 

Во-первых, мы должны получить IP-адрес нашего посетителя. Сделать это можно следующим образом:

 

<%

  strIP = Request.ServerVariables("HTTP_REMOTE_ADDR")

%>

 

ServerVariables содержит HTTP заголовки, отправленные браузером пользователя. Переменная "HTTP_REMOTE_ADDR" содержит IP-адрес посетителя сайта. Так, мы можем получить IP-адрес в формате xxx.xxx.xxx.xxx, например такой: 108.89.128.147.

 

Но, поскольку в нашей базе данных нет IP-адресов, а есть только область IP, мы должны конвертировать IP-адрес в область IP. Для этого, можно использовать следующую формулу:

 

A * (256*256*256) + B * (256*256) + C * 256 + D

 

, где A, B, C и D представляют собой IP-адрес: A.B.C.D.

 

И так, для удобства, мы можем сделать функцию, которая будет преобразовывать IP-адрес в область IP:

 

<%

  Private Function ipAd2ipNum(ipA)

    strO = ipA

    pos1 = InStr(strO, ".")

    intA = CInt(Left(strO, (pos1-1)))

    strO2 = Mid(strO, pos1+1, len(strO))

    pos2 = InStr(strO2, ".")

    intB = CInt(Left(strO2, (pos2-1)))

    strO3 = Mid(strO2, pos2+1, len(strO2))

    pos3 = InStr(strO3, ".")

    intC = CInt(Left(strO3, (pos3-1)))

    intD = CInt(Mid(strO3, pos3+1, len(strO3)))

    intConvert = (intA*(256*256*256)) + (intB*(256*256)) + (intC*256) + intD

    ipAd2ipNum = Trim(intConvert)

  End Function

%>

 

Использовать эту функцию можно так:

 

<%

  strIP = Request.ServerVariables("HTTP_REMOTE_ADDR")

  strIPN = ipAd2ipNum(strIP)

%>

 

Таким образом мы получаем область IP из нашего IP-адреса, теперь мы готовы получить страну из нашей базы данных.

 

Выполнение запроса

 

Теперь, когда мы знаем область IP нашего посетителя сайта, мы напишем запрос на поиск названия страны посетителя в базе данных.

 

Для начала, необходимо подключиться к нашей базе данных:

 

<%

  strConString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="

  strConString = strConString & Server.MapPath("ip2country.mdb")

 

  Set objCon = Server.CreateObject("ADODB.Connection")

  objCon.Open strConString

%>

 

Теперь, когда соединение установлено, мы можем приступить к написанию запроса:

 

<%

  strSQL = "select co_name from ip2c where ip_from<=" & strIPN

  strSQL = strSQL & "and ip_to>=" & strIPN

 

  Set objRs = Server.CreateObject("ADODB.Recordset")

  objRs.Open strSQL,objCon

%>

 

После чего, выводим результаты выполнения запроса:

 

<%

  If NOT(objRs.EOF) OR NOT(objRs.BOF) Then

    strCountry = objRs.Fields("co_name")

%>

Ваш IP-адрес:- <%=strIP%><br>

Ваша страна:- <%=strCountry%>

<%

  Else

%>

Ваш IP-адрес:- <%=strIP%><br>

Ваша страна:- <b>unlisted</b>

<%

  End If

 

  objRs.Close

  objCon.Close

  Set objRs = nothing

  Set objCon = nothing

  Set strSQL = nothing

%>

 

И так, мы выводим IP-адрес и название страны нашего посетителя сайта. Если страна не найдена в базе данных, то мы выводим сообщение: «unlisted».

 

Полный листинг находится ниже.

 

Полный листинг

 

<% @language="VBScript" %>

<%

  Private Function ipAd2ipNum(ipA)

    strO = ipA

    pos1 = InStr(strO, ".")

    intA = CInt(Left(strO, (pos1-1)))

    strO2 = Mid(strO, pos1+1, len(strO))

    pos2 = InStr(strO2, ".")

    intB = CInt(Left(strO2, (pos2-1)))

    strO3 = Mid(strO2, pos2+1, len(strO2))

    pos3 = InStr(strO3, ".")

    intC = CInt(Left(strO3, (pos3-1)))

    intD = CInt(Mid(strO3, pos3+1, len(strO3)))

    intConvert = (intA*(256*256*256)) + (intB*(256*256)) + (intC*256) + intD

    ipAd2ipNum = Trim(intConvert)

  End Function

 

  strConString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="

  strConString = strConString & Server.MapPath("ip2country.mdb")

 

  Set objCon = Server.CreateObject("ADODB.Connection")

  objCon.Open strConString

  If NOT(objRs.EOF) OR NOT(objRs.BOF) Then

    strCountry = objRs.Fields("co_name")

%>

Ваш IP-адрес:- <%=strIP%><br>

Ваша страна:- <%=strCountry%>

<%

  Else

%>

Ваш IP-адрес:- <%=strIP%><br>

Ваша страна:- <b>unlisted</b>

<%

  End If

 

  objRs.Close

  objCon.Close

  Set objRs = nothing

  Set objCon = nothing

  Set strSQL = nothing

%>

 

Заключение

 

И так, в этой статье приведен простой пример, как узнать страну посетителя нашего сайта по его IP-адресу, средствами ASP.

 

Использовать этот метод можно где угодно и для чего угодно.

 

Как я уже говорил, существует множество бесплатных серверов, которые предоставляют базы данных с данными соответствия стран IP-адресу, но также, есть и платные базы данных, которые содержат штат, город, ISP и многую другую информацию. Например, на сервере http://www.ip-to-location.com/ также можно найти за определенную плату базу данных с более подробной информацией об областях IP.

 

Но помимо этого, существует множество сайтов, которые предоставляют бесплатный интерфейс, для получения подробной информации об IP-адресе.

Файлы (всего: 1)

+ База данных IP стран (612.41 Kb)

Комментарии (всего: 14)

Добавить комментарий rss
Автор: ZemoN @ 08 ноября 2008, 22:24   ·   ссылка
а не могли бы вы показать на примере блокировку определенной страны? и подскажите куда этот код всталять?
Автор: Алексей Немиро @ 09 ноября 2008, 04:48   ·   ссылка
В случае с классическим ASP, лучше это делать в файле Global.asa, либо в каком-нибудь include-файле, который есть на всех страницах сайта.

Код, наверное будет примерно такой:
Private Function ipAd2ipNum(ipA)
strO = ipA
pos1 = InStr(strO, ".")
intA = CInt(Left(strO, (pos1-1)))
strO2 = Mid(strO, pos1+1, len(strO))
pos2 = InStr(strO2, ".")
intB = CInt(Left(strO2, (pos2-1)))
strO3 = Mid(strO2, pos2+1, len(strO2))
pos3 = InStr(strO3, ".")
intC = CInt(Left(strO3, (pos3-1)))
intD = CInt(Mid(strO3, pos3+1, len(strO3)))
intConvert = (intA*(256*256*256)) + (intB*(256*256)) + (intC*256) + intD
ipAd2ipNum = Trim(intConvert)
End Function


strConString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="
strConString = strConString & Server.MapPath("ip2country.mdb")


Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Open strConString

If NOT(objRs.EOF) OR NOT(objRs.BOF) Then

strCountry = objRs.Fields("co_name")
If LCase(strCountry) = "russia" Then
Response.Redirect("http://yandex.ru")
End If
Else
'не удалось определить страну
End If

objRs.Close
objCon.Close
Set objRs = nothing
Set objCon = nothing
Set strSQL = nothing
Автор: ZemoN @ 09 ноября 2008, 12:34   ·   ссылка
в том то и дело что у меня нет include-файле, также хост не дает поставить модуль GeoIp... вообщем ж.па
честно говоря я ПШП чайник и тока-тока начал в .htaccess разбираться...
наверно надо это код поставить ПШП, но как его нужно назвать... да и как его привязовать к сайту???
Не раскажите ли подробно?
Автор: Алексей Немиро @ 09 ноября 2008, 13:03   ·   ссылка
честно говоря я ПШП чайник и тока-тока начал в .htaccess разбираться.

Причем тут PHP и .htaccess :) В статья используется ASP/VBScript, это совершенно разные технологии.

Запрет доступа по одному (нескольким) апи в .htaccess можно сделать примерно так:
< Limit GET/>
Order allow,deny
Deny from 127.0.0.1
Allow from All

Собственно, вот хелп http://httpd.apache.org/docs/1.3/mod/mod_access.html (англ.)

Для страны, возможно, поможет этот код (не проверял):
function whois($ip) {
if ($ip!="") {
$sock = fsockopen ("whois.ripe.net",43,$errno,$errstr);
if ($sock) {
fputs ($sock, $ip."\r\n");
while (!feof($sock)) {
$str.=trim(fgets ($sock,128)." <br>");
}
}
else {
$str.="$errno($errstr)";
return;
}
fclose ($sock);
}
return $str;
}

$whois = whois($_SERVER['REMOTE_ADDR']);

$need = "country:";
$pos = strpos($whois,$need);
$search = substr($whois,$pos,18);

$excount = explode(":", $search);

$country = trim($excount[1]);

if($country == "US") {
echo "Your IP banned! He-he...";

exit();

}

Правда, это не лучший вариант.

Если использовать приведенный в этой статье код, то чтобы все было нормально, придется переносить данные из БД в какой-нибудь MySql. Также придется переписывать код на PHP, это в принципе не сложно. Чтобы по 10 раз не проверять апи юзера, желательно ставить какую-нибудь отметку в Session.
Автор: ZemoN @ 09 ноября 2008, 13:31   ·   ссылка
Ладно... перефразирую вопрос :
Как технически (желательно готовый пример) осуществить блокировку России на сайт?
[U]В наличии ИМЕЕТСЯ[/U]:
[I]-база Ip по странам от MaxMind в формате "*.csv" и "*.dat"[/I]
[U]В наличии НЕ ИМЕЕТСЯ[/U]:
[I]-возможность поставить модуль GeoIp на хост
-знание ПШП и ASP/VBScript[/I]
Автор: Алексей Немиро @ 09 ноября 2008, 14:09   ·   ссылка
Чтение CSV средставами PHP:
http://ru2.php.net/manual/ru/function.fgetcsv.php
http://ru2.php.net/manual/ru/function.str-getcsv.php

Как технически (желательно готовый пример) осуществить блокировку России на сайт?

Примеры вполне рабочие, как на ASP,
http://aleksey.nemiro.ru/comment/227.html
так и на PHP:
http://aleksey.nemiro.ru/comment/229.html

Куда их вставлять, я сказать не смогу, ровно также, как не смогу сказать, куда прикрутить розетку в вашей квартире.

Примеров готовей готового не бывает :)
Автор: ZemoN @ 09 ноября 2008, 14:29   ·   ссылка
Куда их вставлять, я сказать не смогу, ровно также, как не смогу сказать, куда прикрутить розетку в вашей квартире.

не нуна мне резетка ))) нуно просто блокировать весь сайт для пользователей из России... делов то .... особенно для прожженых web-мастеров, так сказать гуру своего дела ;)
Автор: Алексей Немиро @ 09 ноября 2008, 14:43   ·   ссылка
В ASP, как я уже говорил, для этих целей можно использовать файл Global.asa
<SCRIPT RUNAT=Server LANGUAGE=VBScript>
Sub Session_OnStart

strConString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="
strConString = strConString & Server.MapPath("ip2country.mdb")


Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Open strConString

If NOT(objRs.EOF) OR NOT(objRs.BOF) Then

strCountry = objRs.Fields("co_name")
If LCase(strCountry) = "usa" Then
Response.Redirect("http://yandex.ru")
End If
Else
'не удалось определить страну
End If

objRs.Close
objCon.Close
Set objRs = nothing
Set objCon = nothing
Set strSQL = nothing

End Sub

Private Function ipAd2ipNum(ipA)
strO = ipA
pos1 = InStr(strO, ".")
intA = CInt(Left(strO, (pos1-1)))
strO2 = Mid(strO, pos1+1, len(strO))
pos2 = InStr(strO2, ".")
intB = CInt(Left(strO2, (pos2-1)))
strO3 = Mid(strO2, pos2+1, len(strO2))
pos3 = InStr(strO3, ".")
intC = CInt(Left(strO3, (pos3-1)))
intD = CInt(Mid(strO3, pos3+1, len(strO3)))
intConvert = (intA*(256*256*256)) + (intB*(256*256)) + (intC*256) + intD
ipAd2ipNum = Trim(intConvert)
End Function
</SCRIPT>

В PHP - инклуды, либо делать редирект при помощи mod_rewrite, но это геморрно, проще, имхо, инклуд прикрутить ко всем страницам.

нуно просто блокировать весь сайт для пользователей из России

Я патриот, Россию нельзя блокировать :)
Автор: ZemoN @ 09 ноября 2008, 14:59   ·   ссылка
Я патриот, Россию нельзя блокировать :)

я тоже патриот) вот поэтому и не хочу чтобы они видили эту ахинею ))
В ASP, как я уже говорил, для этих целей можно использовать файл Global.asa

с этого места поподробней) файл Global.asa самому созжовать или как? и к чему его привязовать и куда ложить?
Автор: Алексей Немиро @ 09 ноября 2008, 15:05   ·   ссылка
с этого места поподробней) файл Global.asa самому созжовать или как? и к чему его привязовать и куда ложить?

Global.asa - обычный текстовой файл, размещается в корневом каталоге веб-приложения, используется для обработки глобальных событий сервера. В приведенном выше примере обрабатывается событие начала сессии (Session_OnStart).
Страницы: 1 · 2

Добавить комментарий

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учётная запись на этом сайте, пройдите процудуру авторизации.
В противном случае, зарегистрируйтесь на сайте.