Вертикаль власти eto'o Хакер, номер #080, стр. 080-124-5 Было бы весьма кстати научиться это делать, ведь любому кардеру очень нужны локализованные соксы, чтобы правдоподобно имитировать транзакции владельцев кредитных карт. Если клиент не использует vpn-туннелей и прочей анонимной бодяги, то по его родному адресу можно указать на географическое расположение. Сделать это совсем несложно, вбив айпишник в соответствующую форму на www.nic.ru/whois. Однако сам понимаешь, что осуществлять руками поиск для каждого из тысяч ботов - занятие мало совместимое с психическим здоровьем. Поэтому, разумеется, мы научимся определять расположение клиента автоматически, при помощи специального скрипта. Вообще говоря, наша задача на ближайшие 20 минут заключается в следующем. Нужно написать функцию, которая по передаваемому ей ip-адресу извлекала бы максимум информации о географическом расположении этой точки. Сделать это можно несколькими способами: использовать сетевые функции для работы с whois-сервисом, использовать один из web-гейтов, или вовсе - заюзать стандартную юниксовую программу whois. На самом деле, это совершенно неважно, каким образом получать данные из whois, поэтому я, чтобы не нагромождать кода, буду использовать стандартную утилиту whois из поставки unix. Вообще, концепция здесь следующая. Получается полный whois-ответ по конкретному адресу и затем из него выбираются необходимые поля: Country, City, StateProv, PostalCode, NetRange, address. Для записи и хранения этой информации нам потребуется еще одна таблица, которую я назвал locations: [структура таблицы locations] CREATE TABLE LOCATIONS( FROM_IP INT NOT NULL PRIMARY KEY, TO_IP INT NOT NULL, COUNTRY VARCHAR(2), CITY VARCHAR(50), STATEPROV VARCHAR(2), POSTAL VARCHAR(8), ADDRESS VARCHAR(100)); Здесь используется, на самом деле, концепция кеширования запросов: ведь, получив один раз информацию об адресах определенной сети, глупо записывать в таблицу лишь один адрес, вполне вероятно, что вскоре надо будет проверить еще одну машину из этой же области. Поэтому вместо интуитивно ожидаемого поля "IP" я использую два: "FROM_IP" и "TO_IP", эти параметры определяют зарезервированный для сети промежуток адресов, который получается из параметра netrange. Такое кэширование позволяет оптимизировать процесс определения местоположения клиентов. Чтобы не быть голословным, приведу поскипанный пример кода: [определение географии клиента по ip] $fp = popen('whois $ip, 'r'); #открываем пайп с процессом $read = fread($fp, 20480); #читаем поток вывода $li=explode("\n", $read); pclose($fp); $not=0; for($i=0; $i<count($li); $i++) {#в цикле по всем строкам if(ereg("^OrgName: RIPE Network Coordination Centre",$li[$i])) {$not=1;}# $not - флаг того, что информация об адресе находится на другом сервере и будет использован несколько иной формат данных if(ereg("^[c|C]ountry:[ ]{0,10}([[:upper:]]{2})",$li[$i], $ar)){ $country=$ar[1];#Извлекаем информацию о стране - двузначный код } if(ereg("^City:[ ]{0,10}([[:alpha:]]{1,30})",$li[$i], $ar)) { |