Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите дополнить код

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
event
Отправлено: 09 Февраля, 2012 - 11:23:31
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Привет, есть такая функция:
PHP:
скопировать код в буфер обмена
  1. function access() {
  2.  
  3. /*Данные для авторизации*/
  4. $config['login'] = "admin"; //Логин Администратора
  5. $config['password'] = "4ad71f4d98610ff76837170912ece1ff"; //Пароль Администратора, хранится в MD5
  6. $config['ipusers'] = array("188.222.22.222"); //IP адресса Администраторов.
  7.        
  8. if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] <> $config['login'] || md5(md5($_SERVER['PHP_AUTH_PW']).$_SERVER['PHP_AUTH_USER']) <> $config['password']){
  9.  
  10. header("WWW-Authenticate: Basic realm=\"Administration\"");
  11. header("HTTP/1.0 401 Unauthorized");
  12.  
  13. bark("Вы ошиблись при наборе логина или пароля.");
  14. }
  15.  
  16. unset($config['login'], $config['password']);
  17. }


В переменной содержится список IP адресов, нужно на начале функции сделать проверку, а точнее проверяем айпи адрес юзверя, если его айпи-адресс есть в списке (в переменной $config['ipusers'], то продолжаем выполнять функцию, если нет, выкидываем die, ну вот помогите реализовать
 
 Top
garvey
Отправлено: 09 Февраля, 2012 - 11:30:58
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


Помог: 3 раз(а)




PHP:
скопировать код в буфер обмена
  1. function access()
  2. {
  3.     $config['login'] = "admin";
  4.     $config['password'] = "4ad71f4d98610ff76837170912ece1ff";
  5.     $config['ipusers'] = array("188.222.22.222");
  6.     if (!in_array($_SERVER['REMOTE_ADDR'], $config['ipusers'])) {
  7.         die('IP не поддерживается.');
  8.     }
  9.  
  10.     if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] <> $config['login'] || md5(md5($_SERVER['PHP_AUTH_PW']) . $_SERVER['PHP_AUTH_USER']) <> $config['password']) {
  11.  
  12.         header("WWW-Authenticate: Basic realm=\"Administration\"");
  13.         header("HTTP/1.0 401 Unauthorized");
  14.  
  15.         bark("Вы ошиблись при наборе логина или пароля.");
  16.     }
  17.  
  18.     unset($config['login'], $config['password']);
  19. }
 
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 11:39:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 187
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




Логично, только не забудьте что IP нужно проверять не только через REMOTE_ADDR
а хотябы вот так
PHP:
скопировать код в буфер обмена
  1. if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),'unknown'))
  2.     $ip = getenv("HTTP_CLIENT_IP");
  3.  
  4.   elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), 'unknown'))
  5.     $ip = getenv("HTTP_X_FORWARDED_FOR");
  6.  
  7.   elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), 'unknown'))
  8.     $ip = getenv("REMOTE_ADDR");
  9.  
  10.   elseif (!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown'))
  11.     $ip = $_SERVER['REMOTE_ADDR'];
  12.  
  13.   else
  14.     $ip = 'unknown';

(Добавление)
и кстати.
PHP:
скопировать код в буфер обмена
  1. {
  2.     $config['login'] ='admin';
  3.     $config['password'] = '4ad71f4d98610ff76837170912ece1ff';
  4.     $config['ipusers'] = array('188.222.22.222');
  5.     if (!in_array($_SERVER['REMOTE_ADDR'], $config['ipusers'])) {
  6.         die('IP не поддерживается.');
  7.     }
  8.  
  9.     if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] <> $config['login'] || md5(md5($_SERVER['PHP_AUTH_PW']) . $_SERVER['PHP_AUTH_USER']) <> $config['password']) {
  10.  
  11.         header('WWW-Authenticate: Basic realm="Administration"');
  12.         header('HTTP/1.0 401 Unauthorized');
  13.  
  14.         bark('Вы ошиблись при наборе логина или пароля.');
  15.     }
  16.  
  17.     unset($config['login'], $config['password']);
  18. }

Вот так код писать ПРАВИЛЬНО.
Двойные ковычки " используются только в случае если между ними находится переменная. PHP подсознательно начинает разбирать строку, в поиске значений переменных, которые на самом деле вообще не переменные, а строки, в результате код работает медленнее.

(Отредактировано автором: 09 Февраля, 2012 - 11:47:34)

 
 Top
Мелкий Супермодератор
Отправлено: 09 Февраля, 2012 - 11:55:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Uchenik пишет:
только не забудьте что IP нужно проверять не только через REMOTE_ADDR

phpfaq.ru/ip


-----
PostgreSQL DBA
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 11:56:22
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Uchenik, не говорите ерунды, опиратся на переменные окружения начинающихся с HTTP_ мягко сказать не правильно. Так как в них можно посунуть что угодно, единственный правильный вариант это $_SERVER['REMOTE_ADDR']; Так как именно эта переменная содержит IP узла, который отправил запрос.

(Отредактировано автором: 09 Февраля, 2012 - 11:57:32)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 11:58:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 187
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




Мелкий
Ну да. А я и имел ввиду ЧИСТЫЙ конечный IP, а не IP например, провайдера или шлюза =)
(Добавление)
snikers987 ???
Зачем тогда нужно было изобретать велосипед и придумывать все эти конструкции, если всё решает банальный $_SERVER['REMOTE_ADDR'];

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

(Отредактировано автором: 09 Февраля, 2012 - 12:03:12)

 
 Top
EuGen Администратор
Отправлено: 09 Февраля, 2012 - 12:02:10
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




snikers987 пишет:
Так как именно эта переменная содержит IP узла, который отправил запрос

Ну и это тоже не верно.
Вообще есть IP-spoofing, но даже если без него, содержимое REMOTE_ADDR зависит от веб-сервера и, кроме того, в любом случае содержит не адрес хоста-отправителя, а адрес последнего устройства третьего уровня модели OSI на пути следования пакета от хоста клиента до сервера (а сказав короче - адрес последнего маршрутизатора на канале от клиента до сервера)

Все это к чему? 100% проверке IP доверять нельзя.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 12:03:11
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Uchenik пишет:

snikers987 ???
Зачем тогда нужно было изобретать велосипед и придумывать все эти конструкции, если всё решает банальный $_SERVER['REMOTE_ADDR'];

Ссылку, которую дал Мелкий, читали?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 12:04:06
Post Id



Частый гость


Покинул форум
Сообщений всего: 187
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




EuGen
УРРА!
Как я ждал авторитетное подтверждение своих слов!
(Добавление)
snikers987
конечно читал, и всё-равно остался при своём мнении. Тем более, как сказал EuGen подобным проверкам на 100% верить нельзя, поэтому абсолютно без разницы кто и как собирает велосипед =)
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 12:06:15
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




EuGen пишет:
snikers987 пишет:
Так как именно эта переменная содержит IP узла, который отправил запрос

Ну и это тоже не верно.

Я имелл ввиду именно то что Вы написали, но не правильно сформулировал. Ниндзя
(Добавление)
Uchenik пишет:
EuGen
УРРА!
Как я ждал авторитетное подтверждение своих слов!

И где там подверждение Ваших слов? Однако
$_SERVER['REMOTE_ADDR']; во всяком случаи клиент не может прислать вместо ip "Hello world"

(Отредактировано автором: 09 Февраля, 2012 - 12:10:30)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
EuGen Администратор
Отправлено: 09 Февраля, 2012 - 12:10:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Uchenik
И в чем же подтверждение? Я сказал лишь про REMOTE_ADDR. Вам же правда нужно прочесть то, что сказали выше.
А HTTP_X_FORWARDED_FOR - это уже совсем другая история и чтобы ее подделать можно просто послать соответствующий заголовок в запросе на сервер. Либо же это как угодно может меняться любым прокси-сервером на маршруте. Так что доверия этим данным не может быть никакого. Почитайте про эту переменную окружения впридачу к тому, что выше сказали.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 12:15:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 187
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




Хм
почитаю повнимательнее.
А код всё-равно неправильно оформлен. Язычок
как я уже говорил выше, подобное оформление кода приводит к дополнительным нагрузкам! Радость
И с этим нельзя не согласиться =)
 
 Top
Мелкий Супермодератор
Отправлено: 09 Февраля, 2012 - 12:24:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Uchenik пишет:
А я и имел ввиду ЧИСТЫЙ конечный IP

0) Ну и чего вам даст мой ip 192.168.1.2? Или 192.168.1.30-70 (DHCP), когда я с нетбука пишу?
А можно и с 127.0.0.1 в инет ходить - не проблема.
1) с чего вы взяли, что тот IP, который вы получили - вообще является IP? Может, там 0.0.0.0 или 258.156.43.78


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 09 Февраля, 2012 - 14:53:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Часть обсуждения, не имеющая отношения к теме, выделена в:
http://forum.php.su/topic.php?fo...9&topic=4740


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 15:07:17
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Ниндзя

(Отредактировано автором: 09 Февраля, 2012 - 15:12:18)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB