Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

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

 

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

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

тема: Скрытый IP-адрес
 
 автор: sega_z   (01.05.2011 в 12:00)   письмо автору
 
 

Ага, теперь понятно!
Не могу не задать вам, как профи, ещё один наболевший вопрос.
Почему пользователи со скрытым IP адресом обходят моё условие:


if (empty ($_SERVER['REMOTE_ADDR'])) // Если пользователь скрыл свой IP адрес
{
exit ("<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");    
}

  Ответить  
 
 автор: cheops   (01.05.2011 в 12:16)   письмо автору
 
   для: sega_z   (01.05.2011 в 12:00)
 

Переменная $_SERVER['REMOTE_ADDR'] заполняется всегда. Собственно вообще без IP-адреса посетитель не сможет использовать Интернет, когда хотят скрыть свой собственный IP-адрес строят цепочку прокси-серверов, и пользователь входит на ваш сайт использую IP-адрес прокси-сервера, именно он и подставляется в $_SERVER['REMOTE_ADDR'].

PS Под новые вопросы лучше заводить новые темы - на них ссылаться потом проще и они получаются короче.

  Ответить  
 
 автор: sega_z   (01.05.2011 в 12:28)   письмо автору
 
   для: cheops   (01.05.2011 в 12:16)
 

Но почему, когда я заношу переменную $ip = $_SERVER['REMOTE_ADDR']; в базу данных, то она в некоторых случаях пустая?

  Ответить  
 
 автор: cheops   (01.05.2011 в 12:45)   письмо автору
 
   для: sega_z   (01.05.2011 в 12:28)
 

Вероятно какой-то сбой на сервере. В любом случае пользователь без IP-адреса не сможет обратиться к серверу, сервер просто не будет знать куда отправлять IP-пакеты с информацией. А за состояния $_SERVER['REMOTE_ADDR'] несет ответственность сервер - если переменная остается пустой - это его вина (еще переменная может случайно обнуляться в коде, если вы ей манипулируете и случайно затираете).

  Ответить  
 
 автор: sega_z   (01.05.2011 в 12:49)   письмо автору
 
   для: cheops   (01.05.2011 в 12:45)
 

Т.е. по сути данное условие вообще не нужно?


if (empty ($_SERVER['REMOTE_ADDR'])) // Если пользователь скрыл свой IP адрес
{
exit ("<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");    

  Ответить  
 
 автор: cheops   (01.05.2011 в 12:51)   письмо автору
 
   для: sega_z   (01.05.2011 в 12:49)
 

В общем да, хотя его можно оставить, чтобы попытаться зафиксировать этот сбой, а также обработать ситуацию, когда переменная $_SERVER['REMOTE_ADDR'] оказывается пустой.

  Ответить  
 
 автор: sega_z   (01.05.2011 в 12:59)   письмо автору
 
   для: cheops   (01.05.2011 в 12:51)
 

Насчет ошибки сервера, я сомневаюсь, т.к. пустой переменная "$ip" оказывается именно у отрицательных сообщений. Пользователь как то намеренно делает невозможным его блокировку по IP адресу.

  Ответить  
 
 автор: cheops   (01.05.2011 в 13:17)   письмо автору
 
   для: sega_z   (01.05.2011 в 12:59)
 

Возможно просто сервер не настроен на отлов всей информации, попробуйте для таких сообщений сохранять значение переменной окружения HTTP_X_FORWARDED_FOR
<?php
  $ip 
getenv(HTTP_X_FORWARDED_FOR);
?>
посмотрите заполняется ли она. Кроме того не будет лишним провентилировать этот вопрос со службой технической поддержки, возможно на вашем сервере есть специальная переменная окружения, куда в этом случае помещается IP-адрес.

  Ответить  
 
 автор: sega_z   (01.05.2011 в 13:21)   письмо автору
 
   для: cheops   (01.05.2011 в 13:17)
 

А по этой переменной окружения можно блокировать пользователя или она постоянно меняется?

  Ответить  
 
 автор: cheops   (01.05.2011 в 13:28)   письмо автору
 
   для: sega_z   (01.05.2011 в 13:21)
 

Вы сначала посмотрите заполняется ли она, когда к вам приходят пользователи из под прокси-серверов (сохраняйте её, когда она не пустая). Если заполняется, да по этой переменной можно блокировать пользователя - он выходит из под неанонимного прокси-сервера. Однако, стоит проявлять осторожность, многие организации и сети работают из под прокси-серверов, лучше всякий раз смотреть что это за IP-адрес при помощи whois и лишь потом принимать решение банить его или нет. Более того, эту переменную окружения заполняет прокси-сервер, если он анонимный, он этого делать не будет (а у спамеров обычно прокси анонимные, это только честные пользователи ходят из под неанонимных прокси-серверов).

  Ответить  
 
 автор: sega_z   (01.05.2011 в 14:38)   письмо автору
 
   для: cheops   (01.05.2011 в 13:28)
 

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

  Ответить  
 
 автор: sega_z   (01.05.2011 в 15:28)   письмо автору
 
   для: cheops   (01.05.2011 в 13:28)
 

Кстати, техподдержка моего хостинга тоже удивлена причиной пустой переменной $ip.

Вот их ответ:
"Уточните, при этом остальные элементы массива _SERVER притствуют? Заметили ли вы какую-то закономерность в возникновении подобных ошибок (один и тот же клиент или что-то подобное)?"

  Ответить  
 
 автор: cheops   (01.05.2011 в 17:11)   письмо автору
 
   для: sega_z   (01.05.2011 в 15:28)
 

Это вообще говоря редкая штука, чаще всего переменные перезатираются самим скриптом, поэтому очень важно зафиксировать моменты появления этой ошибки, чтобы потом можно было воспроизвести ситуацию.

  Ответить  
 
 автор: sega_z   (01.05.2011 в 17:31)   письмо автору
 
   для: cheops   (01.05.2011 в 17:11)
 

А может составить регулярное выражение для наличия в переменной $ip = $_SERVER['REMOTE_ADDR'] именно IP адреса (они же все одного типа: 102.25.25.52)?

  Ответить  
 
 автор: cheops   (01.05.2011 в 17:35)   письмо автору
 
   для: sega_z   (01.05.2011 в 17:31)
 

Ну в самом простом варианте (без скрупулезного соответствия от 0 до 255) это выражение будет выглядеть так
/^[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}$/
однако в реальности достаточно проверить, чтобы эта переменная не была пустой при помощи empty() - собственно другие варианты уже слишком невероятны, если они случаются - от сервера можно ожидать чего угодно.

  Ответить  
 
 автор: sega_z   (01.05.2011 в 17:44)   письмо автору
 
   для: cheops   (01.05.2011 в 17:35)
 

Да у меня есть проверка:


if (empty ($_SERVER['REMOTE_ADDR'])) // Если пользователь скрыл свой IP адрес
{
exit ("<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");    
}  


И теперь достаточно проверить наличие формы цифр с точками.

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

  Ответить  
 
 автор: cheops   (01.05.2011 в 17:57)   письмо автору
 
   для: sega_z   (01.05.2011 в 17:44)
 

Можно начать отталкиваться примерно от следующего скрипта
<?php
if (!preg_match("/^[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}$/"$_SERVER['REMOTE_ADDR']))

exit (
"<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");     
}
?>

  Ответить  
 
 автор: sega_z   (01.05.2011 в 18:13)   письмо автору
 
   для: cheops   (01.05.2011 в 17:57)
 

Т.е. в этом коде возможны все одно-, двух-, трёх-значные цифры и точки между ними?

  Ответить  
 
 автор: cheops   (01.05.2011 в 20:43)   письмо автору
 
   для: sega_z   (01.05.2011 в 18:13)
 

Да (так как IP-адрес формируется сервером, а не пользователем, этого регулярного выражения должно быть более чем достаточно).

  Ответить  
 
 автор: sega_z   (01.05.2011 в 20:49)   письмо автору
 
   для: cheops   (01.05.2011 в 20:43)
 

Огромное спасибо!!!

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

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