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
Форумы портала PHP.SU :: Версия для печати :: Помогите дополнить код
Форумы портала PHP.SU » » Вопросы новичков » Помогите дополнить код

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

1. event - 09 Февраля, 2012 - 11:23:31 - перейти к сообщению
Привет, есть такая функция:
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, ну вот помогите реализовать
2. garvey - 09 Февраля, 2012 - 11:30:58 - перейти к сообщению
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. }
3. Uchenik - 09 Февраля, 2012 - 11:39:03 - перейти к сообщению
Логично, только не забудьте что 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 подсознательно начинает разбирать строку, в поиске значений переменных, которые на самом деле вообще не переменные, а строки, в результате код работает медленнее.
4. Мелкий - 09 Февраля, 2012 - 11:55:04 - перейти к сообщению
Uchenik пишет:
только не забудьте что IP нужно проверять не только через REMOTE_ADDR

phpfaq.ru/ip
5. snikers987 - 09 Февраля, 2012 - 11:56:22 - перейти к сообщению
Uchenik, не говорите ерунды, опиратся на переменные окружения начинающихся с HTTP_ мягко сказать не правильно. Так как в них можно посунуть что угодно, единственный правильный вариант это $_SERVER['REMOTE_ADDR']; Так как именно эта переменная содержит IP узла, который отправил запрос.
6. Uchenik - 09 Февраля, 2012 - 11:58:11 - перейти к сообщению
Мелкий
Ну да. А я и имел ввиду ЧИСТЫЙ конечный IP, а не IP например, провайдера или шлюза =)
(Добавление)
snikers987 ???
Зачем тогда нужно было изобретать велосипед и придумывать все эти конструкции, если всё решает банальный $_SERVER['REMOTE_ADDR'];

хотя,может вы в чем то и правы, но я использую именно такой вариант, и иногда даже получаю целую цепочку IP адресов.
7. EuGen - 09 Февраля, 2012 - 12:02:10 - перейти к сообщению
snikers987 пишет:
Так как именно эта переменная содержит IP узла, который отправил запрос

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

Все это к чему? 100% проверке IP доверять нельзя.
8. snikers987 - 09 Февраля, 2012 - 12:03:11 - перейти к сообщению
Uchenik пишет:

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

Ссылку, которую дал Мелкий, читали?
9. Uchenik - 09 Февраля, 2012 - 12:04:06 - перейти к сообщению
EuGen
УРРА!
Как я ждал авторитетное подтверждение своих слов!
(Добавление)
snikers987
конечно читал, и всё-равно остался при своём мнении. Тем более, как сказал EuGen подобным проверкам на 100% верить нельзя, поэтому абсолютно без разницы кто и как собирает велосипед =)
10. snikers987 - 09 Февраля, 2012 - 12:06:15 - перейти к сообщению
EuGen пишет:
snikers987 пишет:
Так как именно эта переменная содержит IP узла, который отправил запрос

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

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

И где там подверждение Ваших слов? Однако
$_SERVER['REMOTE_ADDR']; во всяком случаи клиент не может прислать вместо ip "Hello world"
11. EuGen - 09 Февраля, 2012 - 12:10:28 - перейти к сообщению
Uchenik
И в чем же подтверждение? Я сказал лишь про REMOTE_ADDR. Вам же правда нужно прочесть то, что сказали выше.
А HTTP_X_FORWARDED_FOR - это уже совсем другая история и чтобы ее подделать можно просто послать соответствующий заголовок в запросе на сервер. Либо же это как угодно может меняться любым прокси-сервером на маршруте. Так что доверия этим данным не может быть никакого. Почитайте про эту переменную окружения впридачу к тому, что выше сказали.
12. Uchenik - 09 Февраля, 2012 - 12:15:10 - перейти к сообщению
Хм
почитаю повнимательнее.
А код всё-равно неправильно оформлен. Язычок
как я уже говорил выше, подобное оформление кода приводит к дополнительным нагрузкам! Радость
И с этим нельзя не согласиться =)
13. Мелкий - 09 Февраля, 2012 - 12:24:35 - перейти к сообщению
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
14. EuGen - 09 Февраля, 2012 - 14:53:38 - перейти к сообщению
Часть обсуждения, не имеющая отношения к теме, выделена в:
http://forum.php.su/topic.php?fo...9&topic=4740
15. snikers987 - 09 Февраля, 2012 - 15:07:17 - перейти к сообщению
Ниндзя

 

Powered by ExBB FM 1.0 RC1