|
|
|
| Ага, теперь понятно!
Не могу не задать вам, как профи, ещё один наболевший вопрос.
Почему пользователи со скрытым IP адресом обходят моё условие:
if (empty ($_SERVER['REMOTE_ADDR'])) // Если пользователь скрыл свой IP адрес
{
exit ("<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");
}
|
| |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 12:00)
| | Переменная $_SERVER['REMOTE_ADDR'] заполняется всегда. Собственно вообще без IP-адреса посетитель не сможет использовать Интернет, когда хотят скрыть свой собственный IP-адрес строят цепочку прокси-серверов, и пользователь входит на ваш сайт использую IP-адрес прокси-сервера, именно он и подставляется в $_SERVER['REMOTE_ADDR'].
PS Под новые вопросы лучше заводить новые темы - на них ссылаться потом проще и они получаются короче. | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 12:16)
| | Но почему, когда я заношу переменную $ip = $_SERVER['REMOTE_ADDR']; в базу данных, то она в некоторых случаях пустая? | |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 12:28)
| | Вероятно какой-то сбой на сервере. В любом случае пользователь без IP-адреса не сможет обратиться к серверу, сервер просто не будет знать куда отправлять IP-пакеты с информацией. А за состояния $_SERVER['REMOTE_ADDR'] несет ответственность сервер - если переменная остается пустой - это его вина (еще переменная может случайно обнуляться в коде, если вы ей манипулируете и случайно затираете). | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 12:45)
| | Т.е. по сути данное условие вообще не нужно?
if (empty ($_SERVER['REMOTE_ADDR'])) // Если пользователь скрыл свой IP адрес
{
exit ("<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");
}
|
| |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 12:49)
| | В общем да, хотя его можно оставить, чтобы попытаться зафиксировать этот сбой, а также обработать ситуацию, когда переменная $_SERVER['REMOTE_ADDR'] оказывается пустой. | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 12:51)
| | Насчет ошибки сервера, я сомневаюсь, т.к. пустой переменная "$ip" оказывается именно у отрицательных сообщений. Пользователь как то намеренно делает невозможным его блокировку по IP адресу. | |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 12:59)
| | Возможно просто сервер не настроен на отлов всей информации, попробуйте для таких сообщений сохранять значение переменной окружения HTTP_X_FORWARDED_FOR
<?php
$ip = getenv(HTTP_X_FORWARDED_FOR);
?>
| посмотрите заполняется ли она. Кроме того не будет лишним провентилировать этот вопрос со службой технической поддержки, возможно на вашем сервере есть специальная переменная окружения, куда в этом случае помещается IP-адрес. | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 13:17)
| | А по этой переменной окружения можно блокировать пользователя или она постоянно меняется? | |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 13:21)
| | Вы сначала посмотрите заполняется ли она, когда к вам приходят пользователи из под прокси-серверов (сохраняйте её, когда она не пустая). Если заполняется, да по этой переменной можно блокировать пользователя - он выходит из под неанонимного прокси-сервера. Однако, стоит проявлять осторожность, многие организации и сети работают из под прокси-серверов, лучше всякий раз смотреть что это за IP-адрес при помощи whois и лишь потом принимать решение банить его или нет. Более того, эту переменную окружения заполняет прокси-сервер, если он анонимный, он этого делать не будет (а у спамеров обычно прокси анонимные, это только честные пользователи ходят из под неанонимных прокси-серверов). | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 13:28)
| | С данным вопросом я обратился в техподдержку хостинга, жду ответа ...
Сообщу вам о результатах. | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 13:28)
| | Кстати, техподдержка моего хостинга тоже удивлена причиной пустой переменной $ip.
Вот их ответ:
"Уточните, при этом остальные элементы массива _SERVER притствуют? Заметили ли вы какую-то закономерность в возникновении подобных ошибок (один и тот же клиент или что-то подобное)?" | |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 15:28)
| | Это вообще говоря редкая штука, чаще всего переменные перезатираются самим скриптом, поэтому очень важно зафиксировать моменты появления этой ошибки, чтобы потом можно было воспроизвести ситуацию. | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 17:11)
| | А может составить регулярное выражение для наличия в переменной $ip = $_SERVER['REMOTE_ADDR'] именно IP адреса (они же все одного типа: 102.25.25.52)? | |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 17:31)
| | Ну в самом простом варианте (без скрупулезного соответствия от 0 до 255) это выражение будет выглядеть так
/^[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}$/
| однако в реальности достаточно проверить, чтобы эта переменная не была пустой при помощи empty() - собственно другие варианты уже слишком невероятны, если они случаются - от сервера можно ожидать чего угодно. | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 17:35)
| | Да у меня есть проверка:
if (empty ($_SERVER['REMOTE_ADDR'])) // Если пользователь скрыл свой IP адрес
{
exit ("<br><h3 align='center'>Сообщения от пользователей со скрытым IP адресом не принимаются<h3>");
}
|
И теперь достаточно проверить наличие формы цифр с точками.
Можете написать полный код регулярного выражения, а то я их как то не очень понимаю. | |
|
|
|
|
|
|
|
для: 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>");
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 17:57)
| | Т.е. в этом коде возможны все одно-, двух-, трёх-значные цифры и точки между ними? | |
|
|
|
|
|
|
|
для: sega_z
(01.05.2011 в 18:13)
| | Да (так как IP-адрес формируется сервером, а не пользователем, этого регулярного выражения должно быть более чем достаточно). | |
|
|
|
|
|
|
|
для: cheops
(01.05.2011 в 20:43)
| | Огромное спасибо!!! | |
|
|
|