|
|
|
| Всем привет. Есть пара вопросов по этой теме:
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 адреса?
Спасибо за ответы. | |
|
|
|
|
|
|
|
для: 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 там может быть (и часто бывает) всё что угодно, потому и производятся проверки регулярными выражениями (причём неправильными). | |
|
|
|
|
|
|
|
для: Саня
(19.09.2011 в 13:09)
| | 1. по поводу хранения ip адресов говорят, что есть новые айпишники, которые даже в BIGINT не поместятся, что же тогда делать? не преобразовывать в числовой тип?
2. я понимаю, что X-Forwarded-For и X-Real-IP ненадёжны, но если человек будет идти на сайт через проксик, тем более скрытый, то REMOTE_ADDR не определит его....верно? если да, то просто необходимо использовать все варианты. и не совсем понял, регулярки разве неверны? | |
|
|
|
|
|
|
|
для: 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-адрес
|
| |
|
|
|
|
|
|
|
для: Саня
(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? | |
|
|
|
|
|
|
|
для: 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 при двухуровневой организации веб-сервера. | |
|
|
|
|
|
|
|
для: Саня
(19.09.2011 в 14:34)
| | 1. выборки по ИП будут, т.е. нужное поле будет выбираться по нескольким параметрам - ИП, ИД странички, номер сессии, дата, юзер агент.......
При таком раскладе, если использовать текстовый тип для ИП, выборки гораздо медленней будут проходить и тогда уже лучше использовать числовой тип? и я думаю стоит не обращать внимание на ип6, т.к. выше говорилось, что еще он не совсем распространен...верно?
2. для ведения статистики сейчас используется X-Real-IP, т.к. ранее при REMOTE_ADDR выдавало локальный ип сервера для каждого юзера
X-Forwarded-For - определение ИП адреса клиента который вошел через прокси? чет я совсем запутался, какие варианты предпринимать
П.С. сейчас админ сервера говорит, что REMOTE_ADDR исправно определяет ИП адреса, не так как раньше, локальные.....говорит пропатчил нгинкс и теперь все ок
значит мне вполне хватит REMOTE_ADDR для определения ИПов как обычных так и через прокси сервера? | |
|
|
|
|
|
|
|
для: 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, и какой-нибудь сервер. | |
|
|
|
|
|
|
|
для: Саня
(19.09.2011 в 19:57)
| | ясно, хороший ход для мониторинга, т.е. пишем REMOTE_ADDR в числовом виде в одно поле и X-Forwarded-For в другое, только тип варчар.
регулярками проверять все таки нужно? | |
|
|
|
|
|
|
|
для: TetRiska
(20.09.2011 в 02:34)
| | > регулярками проверять все таки нужно?
Как хотите. Для собственного успокоения можете и проверять. | |
|
|
|