Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546

Не определяет и не записывает ИП

02.04.2010, 11:22. Показов 3731. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
при должен заноситься ИП в БД. Почему-то не определяет и не заносит. Значение пустое вводит в таблицу...
PHP
1
2
3
4
5
6
7
8
9
$ip=GetEnv("HTTP_X_REAL_IP");
if(empty($ip)){
    if (getenv('HTTP_X_FORWARDED_FOR')){
        $ip=getenv('HTTP_X_FORWARDED_FOR');
    }else{
        $ip=getenv('HTTP_X_REAL_IP');
    }
 
}
PHP
1
$p=@mysql_query("INSERT INTO players (ip) values('".$ip."')");
в чем может быть причина?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2010, 11:22
Ответы с готовыми решениями:

Скрипт, который в разные строки записывает буквы и цифры, цифры записывает как сумму
помогите сделать скрипт, который в разные строки записывает буквы и цифры, цифры записывает как сумму всё вводится с клавиатуры тоисть...

Запись в файл не происходит, или не всё записывает, или криво записывает. Что не так?
Здравствуйте! Подскажите пожалуйста - в чем тут может быть проблема?.. Записываю данные в файл, потом вывожу - и вместо того, что бы...

Программа определяет код символа по кодовой таблицей ASCII и определяет размер типа данных в байтах
#include<stdio.h> #include<conio.h> #include <stdlib.h> int main() {puts("My first program"); //вывод сообщения char s='a'; int...

20
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 11:27
Браузер может не передавать информацию в заголоаке HTTP_X_REAL_IP, HTTP_X_FORWARDED_FOR
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 11:29  [ТС]
делал через эксплорер) неужеле он не может? как-то можно решить эту проблему? или юзеры так и останутся в базе без ипа?
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 11:32
Это интересно...
ReadMe
Беллетристика
Один из самых дремучих вопросов в околопхпешном вебе - это определение IP адреса.
Такого количества неправильного кода не написано, наверное, ни для какой другой операции.

Каждый, кто в один прекрасный день узнаёт о существовании переменной HTTP_X_FORWARDED_FOR, тут же воображает себя мегагуру, и заменяет ей REMOTE_ADDR. Потом приходит знание о других переменных (X_REAL_IP, VIA, и ещё вагон и маленькая тележка), изобретаются многослойные мегаконструкции, изобретатели хвастаются друг перед другом их многоэтажностью и сравнивают свои творения с "кодом из PHPbb!".

При этом спроси любого из них - "какой именно адрес они хотят определить?" - ни один не ответит: понимание основ функционирования сети TCP/IP среди пхп-программистов традиционно слабое.
А вот стремление к нахождению Идеального и Единственно Правильного Решения - традиционно сильное.
В результате вместо IP адреса в логи пишется не пойми что.

К примеру, возьмем, казалось бы, простой вопрос "какой именно IP адрес (из цепочки хостов, через которые идет запрос от компьютера клиента к серверу) мы хотим записать в лог?". После того, как выяснилось, что большинство пхп-программистов затрудняются на него ответить, я и решил написать эту заметку.

А это, между прочим, очень важный вопрос. Не ответив на него, наряду с вопросом "Зачем нам нужен IP адрес?", приступать к самому определению бессмысленно.
При том, что большинству читателей этого текста вопросы покажутся бессмысленными.
Ну что ж, попробуем разобраться.

Теория
Во-первых. Самые азы. Для тех, кто не знает.
Все элементы массива $_SERVER, начинающиеся со слова "HTTP_" - это HTTP-заголовки.
Как уже знают вдумчивые читатели фака на танке, HTTP заголовки присылает клиент. И прислать может любые.
К примеру, заголовок X-All-Your-Base-Belongs-To-Us: Surrender!
Или, как вы уже, наверное, догадались, заголовок X-Forwarded-For: admin durak
Мне кажется, что записывать столь глубокомысленную строку вместо IP адреса - не самая лучшая идея.
Как и вообще доверять любым переменным, начинающимся с HTTP. Это первое правило, которое надо запомнить с молоком матери: Любые элементы массива $_SERVER, начинающиеся с "HTTP_", можно использовать только в справочных целях! К примеру, HTTP_REFERER записываем, чтобы потом посмотреть. Но ни в коем случае не делаем на него Location.

Во-вторых, определимся с тем, ДЛЯ ЧЕГО нам нужен IP адрес. Если мы хотим записать в лог, то пишем однозначно только REMOTE_ADDR. В этой переменной содержится реальный IP адрес реального хоста в интернете, который произвел соединение с нашим сервером. Единственный реальный адрес. Никаких других сервер не знает.
Апач пишет в логи именно REMOTE_ADDR. Не надо считать авторов веб-сервера дурнее себя.

Что значит - реальный IP адрес? А то и значит. Адрес хоста, который произвел соединение с нашим сервером. Этот адрес по определению может быть только один. Один, а не 5 по цепочке. Рассмотрим типичный пример:
Есть пользовательский компьютер, который, который находится в офисной сети. IP компьютера 192.168.0.22
Офисная сеть включена через роутер в сеть здания. IP роутера - 10.10.0.3
Сеть здания, в свою очередь, подключена к интернету, через роутер. IP роутера - 77.88.22.11
Пользователь заходит на сайт, через НТТР прокси. IP прокси - 212.121.0.8
Так вот, сеть TCP/IP так устроена, что каждый следующий узел ничего не знает о предыдущих. Есть только пара хостов, которые соединяются друг с другом. В самих TCP/IP пакетах никакой информации о предыдущих хостах не предусмотрено.
Поэтому, как это ни обидно, но реальным адресом мы можем считать только последний в цепочке - адрес HTTP прокси.

Больше того. Ну допустим, узнали мы адрес компьютера пользователя (чем кичатся многие определители с помощью activeX и ява-апплетов). Этот адрес - 192.168.0.22. Он из приватной сети. Компьютеров с такими адресами в мире - миллионы. Найти компьютер по такому адресу - невозможно. Пользы от него - практически никакой. Практически, но не совсем. Почему? Слушаем дальше:

Поскольку в протоколе HTTP текстовые заголовки, то в них можно добавить свой. Что некоторые хосты и делают. В те самые X-Forwarded-For, Via и прочие.
Можем мы их использовать? Можем. Если правильно понимать - для чего.
Для определения "реального IP адреса", как мы уже убедились - нельзя. А для чего же можно? Например - справки. просто записать, на всякий случай. НО! Только в том случае, если мы откажемся от дурацкой идеи найти один идеальный IP адрес. Если мы не будем писать вместо реального всякую лабуду, а будем записывать все похожее на IP адрес с реальным наряду, то почему нет?
Итак, можно записать всё, похожее на IP адрес. Понадобится выявить злостного вредителя - возможно, какой-то интересный айпишник среди заголовков и проскочит.
Для небольшого повышения надежности сессий - тоже можно. Писать в сессию не только реальный, но и все похожие. И все сверять. Хоть один не совпал - сессию рубим.
И в других подобных случаях.
Не забывая: реальный - отдельно, все похожее на IP адрес - отдельно.
Не забывая: особо полагаться на все эти заголовки не стоит.

Практика.
Итак. Из всего вышеизложенного делается простой вывод.
IP адрес в скрипте может быть только один. Лежит он в переменной REMOTE_ADDR.
Следовательно, вожделенный код получания "идеального IP адреса" выглядит, как
$ip=$_SERVER['REMOTE_ADDR']
Точка.

Далее. Если мы хотим воспользоваться "заголовками, похожими на IP адрес" (лучше всего, во избежание недоразумений, совсем не считать их адресами хостов, а HTTP заголовками особого формата. Тем более, что никакого стандарта на содержимое заголовков X-Forwarded-For, Via и прочих - нет. Там могут оказаться IP адреса чарез запятую, или доменные имена или не через запятую. Не говоря уже о подделках!), то нет смысла судорожно искать все имена заголовков, где может встретиться адрес. Проще искать сами адреса.
Берем, пишем простой код, который в цикле перебирает массив $_SERVER, и регулярным выражением выцепляет все заголовки, в которых встречается подхдящая под шаблон IP адреса строка. Если встретилась, то весь заголовок - с именем и всем содержимым - добавляем в массив или в строку. Которая хранится отдельно от IP адреса, в текстовом виде.
Соответственно, в нужном месте повторяем операцию, и сверяем. IP адрес с IP адресом, строку похожих заголовков - со строкой похожих заголовков.
function get_all_ip() {
$ip_pattern="#(??:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";
$ret="";
foreach ($_SERVER as $k => $v) {
if (substr($k,0,5)=="HTTP_" AND preg_match($ip_pattern,$v)) $ret.=$k.": ".$v."\n";
}
return $ret;
}
Такой вот, несложный код.
Правда, нужда в нем, если задуматься, очень невелика. Разве что, для тех же сессий. А для справки, про запас... не проще ли писать вообще все HTTP заголовки, пришедшие в скрипт? И это поинформативнее будет, чем выцеплять какой-то один адрес из HTTP_X_REAL_IP.
Да и для сессий следует применять с осторожностью - IP адрес может оказаться, к примеру, в реферере...

Примечания.
Недавно я выяснил удивительную вещь. Оказывается, на свете существуют криворукие хостеры, у которых на сервере нет REMOTE_ADDR (а точнее есть, но в нем лежит... адрес самого сервера!). И пихают они адрес удаленного хоста кому куда бог на душу положит. Некоторые - вы будете смеяться - в HTTP_X_FORWARDED_FOR. Говорят, в некоторых больших программных продуктах есть даже специальная настройка для таких случаев - "Получать IP-адреса из заголовка X_FORWARDED_FOR".
Разумеется, этот курьёз не опровергает сказанного выше, и не стоит кидаться писать автоматические определители IP с его учетом. Все подобные случаи должны разбираться только в ручном режиме, самим программистом. Который сначала убедится - где именно в HTTP_X_FORWARDED_FOR лежит нужный адрес - в начале цепочки запятых или в конце, напишет правильный рег, и только потом в настройки сайта добавит код
$_SERVER['REMOTE_ADDR']=get_ip_from_xff();

Примечание для хостеров: mod_realip или mod_rpaf
Примечание для пользователей: разумеется, таких хостеров надо избегать, как калёного железа. Наверняка ведь это не единственная их криворукость?
Оригинал статьи - http://www.phpfaq.ru/ip
1
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 11:41  [ТС]
Спасибо огромное
Вопрос, я запутался в составлении запроса на ип)) Помоги пожалуйста))
Пишу
PHP
1
$ip=$_SERVER['REMOTE_ADDR']
и все, так?
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 11:48
Из твоего кода можно убрать else, но добавить $_SERVER['REMOTE_ADDR']. Т.е.
PHP
1
2
3
4
5
6
7
8
9
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else{
$ip=$_SERVER['REMOTE_ADDR'];
}
Подобная фича исользуется в модулях определения географического положения по ip
1
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 11:51  [ТС]
Мне для занесения в базу, далее просто будет проверяться соответствие ипа при регистрации и после неё. Никаких блокировок, просто для информации администрации сайта совпадает он или нет. Бывает такое, что пользователя блочишь, а он говорит, что его взломали и это был не он, запись ипа все решает)
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 11:55
это не панацея...у меня ip-адрес динамический, соответственно после каждой перезагрузки тачки, он разный...

Добавлено через 19 секунд
Я думаю так у большинства

Добавлено через 55 секунд
Нужно использовать всю информацию из заголовков для более точного определения...это и клиент и ОСь
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 11:56  [ТС]
у меня тоже самое, но на каждого провайдера с динамическим адресом выделяется пространство с ипами) + ДНС одинаковый) в общем найти можно что угодно при желании)

Клиент и ось тоже пишется)
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 11:59
Цитата Сообщение от acupation Посмотреть сообщение
$p=@mysql_query("INSERT INTO players (ip) values('".$ip."')");
зачем так?можно так:
PHP
1
    $p=@mysql_query("INSERT INTO `players` SET `ip`='$ip'");
помоему так даже красивее

Добавлено через 1 минуту
Цитата Сообщение от acupation Посмотреть сообщение
у меня тоже самое, но на каждого провайдера с динамическим адресом выделяется пространство с ипами) + ДНС одинаковый)
а если я зайду к тебе через прокси?
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 12:07  [ТС]
ну да, прокси тема) спорить бесполезно. Но однако это лучше чем ничего)
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 12:55
Цитата Сообщение от acupation Посмотреть сообщение
Но однако это лучше чем ничего)
Не всегда...иногда оно может только запутать...

Добавлено через 47 минут
По моему, эта тема больше подходит к разделу PHP и сети
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 13:54  [ТС]
мм, скорее да, я что-то не задумался на тему раздела, простите)
Вопрос ещё раз, на другой странице, ставлю все по примеру,
PHP
1
2
3
4
5
6
7
8
9
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else{
$ip=$_SERVER['REMOTE_ADDR'];
}
далее запросв БД на сохранение
PHP
1
mysql_query("INSERT INTO security (id, user, ip, result) values('".$ctime."', '".$info['user']."', '$ip','1')");
и
PHP
1
mysql_query("INSERT INTO security (id, user, ip, result) values('$ctime', '$info[user]', '$ip', '2')");
Первый случай если все ок, второй если пасс неправильно ввели, записывается ип с которого пытались.
Ни тот ни тот не пишется.... Уточню, не пишется ток IP. Все остальное в базу заносится.
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 14:12
попробуйте вывести переменную $ip... что написано?
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 14:18  [ТС]
всмысле удалить из 2 последних строк?
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 14:26
PHP
1
2
3
4
5
6
7
8
9
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else{
$ip=$_SERVER['REMOTE_ADDR'];
}
echo $ip;
Добавлено через 1 минуту
mysql_query закомментируйте

Добавлено через 5 минут
или после INSERT'а выведи количество затронутых полей....если вернет столько же, сколько и хотел записать, то проблема не mysql_query
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 14:41  [ТС]
Как вывести кол-во затронутых полей не понял, в базу пишется все кроме IP.

Добавлено через 5 минут
Удалил вообще строчку
PHP
1
mysql_num_fields("INSERT INTO security (id, user, ip, result) values('".$ctime."', '".$info['user']."', '$ip','1')");
все равно пишется. Я чет не понял)) не должно же)

Добавлено через 2 минуты
короче я играю не с тем файлом))) Простите)
0
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
02.04.2010, 14:43
СориВот так:
PHP
1
2
3
4
5
6
$query_1=mysql_query("INSERT INTO `security` SET `id`='$ctime', `user`='{$info['user']}', `ip`='$ip', `result`='1'");
$resalt_1=mysql_affected_rows($query);
echo $resalt;
$query_2=mysql_query("INSERT INTO `security` SET `id`='$ctime', `user`='{$info['user']}', `ip`='$ip', `result`='2'");
$resalt_2=mysql_affected_rows($query);
echo $resalt;
Добавлено через 1 минуту
Цитата Сообщение от acupation Посмотреть сообщение
mysql_num_fields
не совсем то, он вернет кол-во указанных в запросе полей
1
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
02.04.2010, 14:47  [ТС]
Оказалось, что у меня два файла с почти одинаковым названием) я просто редактировал другой, спасибо буду знать на будущее хотяб про функции эти)
0
02.04.2010, 14:48

Не по теме:

Цитата Сообщение от acupation Посмотреть сообщение
я просто редактировал другой
Ну это нормально;)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2010, 14:48
Помогаю со студенческими работами здесь

USB не определяет флешки, но определяет мышь и клавиатуру
Доброго времени суток всем! У меня такой вопрос с недавних пор мои усб входа перестали определять флешки, но усб клаву и мышь видят. в чем...

Не записывает в БД
Доброго дня. Пытаюсь записать в БД данные из формы. Но не записывает по какой то причине. В чем проблема? Код обработчик данных:...

Не записывает в БД!
Вот код подключения $server="localhost"; $user="admin"; $password="123"; $db="test_base"; $today = date("m.d.y"); if...

Не записывает в БД
Дание не заносит в БД.<!doctype html> <html> <head> <title>Адмін-панель</title> </head> <body> <?php ...

Не записывает в бд
Не записывает email в бд, а сразу перенаправляет на главную страницу sidebar.php <?php require_once("header.php"); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru