Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Все о ip адресе
 
 автор: TetRiska   (19.09.2011 в 12:03)   письмо автору
 
 

Всем привет. Есть пара вопросов по этой теме:

1 - вычитал, что лучше ip адрес хранить в числовом формате, т.е. для него выделяем поле
`ip` INT(10) UNSIGNED NOT NULL
записываем и получаем с помощью внутренних ф-ций мускула INET_ATON и INET_NTOA
а - собственно зачем в числовом формате хранить?
б - 10 знаков достаточно?

2 - нашел ф-цию которая определяет ip адрес (ранее определял только через $_SERVER["HTTP_X_REAL_IP"]):
function detect_ip() {
    $ip = false;
    if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]) and preg_match("#^[0-9.]+$#", $_SERVER["HTTP_X_FORWARDED_FOR"])) {
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }
    else if (isset($_SERVER["HTTP_X_REAL_IP"]) and preg_match("#^[0-9.]+$#", $_SERVER["HTTP_X_REAL_IP"])) {
        $ip = $_SERVER["HTTP_X_REAL_IP"];
    }
    else if (preg_match("#^[0-9.]+$#", $_SERVER["REMOTE_ADDR"])) {
        $ip = $_SERVER["REMOTE_ADDR"];
    }
    return $ip;
а - этот метод намного эффективен чем просто $_SERVER["HTTP_X_REAL_IP"]?
б - не совсем пойму зачем через регулярку проверяем получаемые ip адреса?

Спасибо за ответы.

  Ответить  
 
 автор: Саня   (19.09.2011 в 13:09)   письмо автору
 
   для: TetRiska   (19.09.2011 в 12:03)
 

1.а. Все IP-адреса — числа. Представление в "десятично-точечном" формате придумано для удобства восприятия человеком. IPv4 занимает ровно 4 байта. То есть INT (желательно UNSIGNED) вполне достаточно. В базах IP-адреса хранят в числовом формате для уменьшения размера поля и для упрощения выборок по диапазонам (особенно это заметно в geoip базах).

1.б. С точки зранения хранения, вычислений и диапазона возможных значений INT(1) ничем не отличается от INT(11). Это просто указание всяким интерактивным инструментам (например консольному клиенту) сколько позиций выделить при выводе этого столбца на экран.

2.а. Адреса, переданные в заголовках X-Forwarded-For и X-Real-IP ненадёжны, так как передаются в заголовках HTTP-запроса и могут быть поддельными. На них не стоит опираться.

2.б. Собственно, из-за того, что X-Forwarded-For и X-Real-IP передаются в заголовках запроса, вместо ip там может быть (и часто бывает) всё что угодно, потому и производятся проверки регулярными выражениями (причём неправильными).

  Ответить  
 
 автор: TetRiska   (19.09.2011 в 13:23)   письмо автору
 
   для: Саня   (19.09.2011 в 13:09)
 

1. по поводу хранения ip адресов говорят, что есть новые айпишники, которые даже в BIGINT не поместятся, что же тогда делать? не преобразовывать в числовой тип?
2. я понимаю, что X-Forwarded-For и X-Real-IP ненадёжны, но если человек будет идти на сайт через проксик, тем более скрытый, то REMOTE_ADDR не определит его....верно? если да, то просто необходимо использовать все варианты. и не совсем понял, регулярки разве неверны?

  Ответить  
 
 автор: Саня   (19.09.2011 в 13:45)   письмо автору
 
   для: TetRiska   (19.09.2011 в 13:23)
 

1. Есть, IPv6 называется. Для его хранения нужно два поля BIGINT. Но пока IPv6 не сильно распространён.

2. REMOTE_ADDR — основной IP-адрес, с которого пришел запрос. X-Real-IP может устанавливаться вышестоящим сервером при двухуровневой организации сервера. Это, по сути, тот же самый адрес клиента. В real ip будет адрес клиента, в remote_addr адрес вышестоящего сервера (например, 127.0.0.3).
X-Forwarded-For МОЖЕТ устанавливаться прокси серверами и в нём МОЖЕТ быть указан реальный IP посетителя. Но это далеко не всегда так.

Поэтому записывайте в базу оба поля и REMOTE_ADDR (или X-Real-IP, или ещё какой, в зависимости от настроек сервера), и X-Forwarded-For, если он установлен (причём в текстовое поле).

> и не совсем понял, регулярки разве неверны?
Проверьте сами:
<?
var_dump
(preg_match("#^[0-9.]+$#"'...100393023.23434..3425....356......'));
// явно не похоже на IP-адрес

  Ответить  
 
 автор: TetRiska   (19.09.2011 в 13:59)   письмо автору
 
   для: Саня   (19.09.2011 в 13:45)
 

1. так как быть, чтобы было хорошо и для ип4 и ип6, текстовое поле или все же числовое, т.е. 2 числовых BIGINT? - только тогда я не пойму как записывать этот ип6 айпишник в эти поля.
2. насколько я понял под айпишник в базе выделять 3 поля (REMOTE_ADDR, X-Forwarded-For и X-Real-IP)?

>Поэтому записывайте в базу оба поля и REMOTE_ADDR (или X-Real-IP, или ещё какой, в зависимости от настроек сервера)
не совсем понял про настройку сервера...

3. как регулярки верно организовать для проверки как ип4 и ип6?

  Ответить  
 
 автор: Саня   (19.09.2011 в 14:34)   письмо автору
 
   для: TetRiska   (19.09.2011 в 13:59)
 

IPv6 можно хранить в VARCHAR(39). Там же можно хранить и IPv4. Если вы не собираетесь делать выборки из базы по IP, то VARCHAR прекрасно подойдёт для этой цели.

> не совсем понял про настройку сервера...
Распространён такой вариант организации веб-сервера:
Устанавливается легковесный веб-сервер (nginx, lighttpd), отдающий статические файлы и организующий кеширование. Запросы к динамическим скриптам через легковесный передаются основному серверу (apache), который их обрабатывает. Апач настраивается на приём подключений только из своей локальной сети. Так как запросы к апачу происходят всегда через nginx, то в переменной REMOTE_ADDR всегда фигурирует IP-адрес, на котором висит nginx. Для этого nginx настраивают так, чтобы он свою переменную REMOTE_ADDR передавал апачу в отдельном заголовке. Имя этого заголовка может быть произвольным, но обычно называют X-Real-IP.

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

> как регулярки верно организовать для проверки как ип4 и ип6?
Поищите в интернете.

> насколько я понял под айпишник в базе выделять 3 поля
> (REMOTE_ADDR, X-Forwarded-For и X-Real-IP)?
X-Real-IP — замена для REMOTE_ADDR при двухуровневой организации веб-сервера.

  Ответить  
 
 автор: TetRiska   (19.09.2011 в 14:57)   письмо автору
 
   для: Саня   (19.09.2011 в 14:34)
 

1. выборки по ИП будут, т.е. нужное поле будет выбираться по нескольким параметрам - ИП, ИД странички, номер сессии, дата, юзер агент.......
При таком раскладе, если использовать текстовый тип для ИП, выборки гораздо медленней будут проходить и тогда уже лучше использовать числовой тип? и я думаю стоит не обращать внимание на ип6, т.к. выше говорилось, что еще он не совсем распространен...верно?
2. для ведения статистики сейчас используется X-Real-IP, т.к. ранее при REMOTE_ADDR выдавало локальный ип сервера для каждого юзера
X-Forwarded-For - определение ИП адреса клиента который вошел через прокси? чет я совсем запутался, какие варианты предпринимать

П.С. сейчас админ сервера говорит, что REMOTE_ADDR исправно определяет ИП адреса, не так как раньше, локальные.....говорит пропатчил нгинкс и теперь все ок

значит мне вполне хватит REMOTE_ADDR для определения ИПов как обычных так и через прокси сервера?

  Ответить  
 
 автор: Саня   (19.09.2011 в 19:57)   письмо автору
 
   для: TetRiska   (19.09.2011 в 14:57)
 

1. Выборки по строковым полям безусловно медленнее чем по числовым.

> не обращать внимание на ип6, т.к. выше говорилось, что еще он не
> совсем распространен...верно?
Оно-то верно, но когда-нибудь всё равно прийдётся учитывать IPv6.

Сделайте поле INT UNSIGNED для учёта REMOTE_ADDR и VARCHAR для X-Forwarded-For. Выборки делайте по REMOTE_ADDR, а X-Forwarded-For просто для информации выводите в таблице с результатами.

> значит мне вполне хватит REMOTE_ADDR для определения ИПов как обычных так и через прокси сервера?
В REMOTE_ADDR записывается IP, с которого произошло подключение. Это может быть и прокси, и пользователь с выделенным IP, и какой-нибудь сервер.

  Ответить  
 
 автор: TetRiska   (20.09.2011 в 02:34)   письмо автору
 
   для: Саня   (19.09.2011 в 19:57)
 

ясно, хороший ход для мониторинга, т.е. пишем REMOTE_ADDR в числовом виде в одно поле и X-Forwarded-For в другое, только тип варчар.

регулярками проверять все таки нужно?

  Ответить  
 
 автор: Саня   (21.09.2011 в 07:08)   письмо автору
 
   для: TetRiska   (20.09.2011 в 02:34)
 

> регулярками проверять все таки нужно?
Как хотите. Для собственного успокоения можете и проверять.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования