Php/ajax REMOTE_ADDR установлен на IP-адрес фиктивного сетевого адаптера
Сегодня я столкнулся с довольно странным поведением моего основанного на php приложения.
В определенной части системы пользовательский интерфейс, использующий AJAX-вызовы для заполнения списка
коробки с содержимым из бэкэнда.
Теперь слушатель AJAX выполняет проверку безопасности всех входящих запросов, убедившись, что
что только действительные клиентские IP-адреса получают ответы. Действительный IP-адрес также хранится в бэкэнде.
Чтобы получить IP-адрес клиента, я использовал простой старый
$_SERVER['REMOTE_ADDR']
который работает для большинства клиентов. Сегодня я столкнулся с установкой, где
remote_addr содержит IP-адрес сетевого адаптера, который был не тот, который выполнял
фактическое сообщение для моего приложения.
Googling around agve me Запись в блоге Roshan по топологии:
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))//check ip is pass from prxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
К сожалению, проблема не устранена.
Кто-нибудь когда-либо спотыкался на эту проблему (на самом деле я не думаю, что я обнаружил совершенно новую проблему ^^), и у меня есть идея, как это исправить?
EDIT:
Я нахожусь на
- Версия PHP 5.2.9-1
- Apache/2.2.9 (Win32)
Связь осуществляется с помощью обычной сетевой карты. Теперь у экземпляра клиента несколько
устройств больше. Адаптеры VMNet и т.д.
Мне интересно, как конфигурация клиента может "нарушить" веб-сервер так много...
ТИА
K
Ответы
Ответ 1
К сожалению, вам нужно взять всю информацию о IP-адресе с солью.
IP-адреса собираются во время запроса, принимая во внимание информацию о пакете и запросе. К сожалению, эта информация может быть легко подделана или даже ошибочна (на основе большого числа сетевых вероятностей) и не должна использоваться ни для чего более, чем для тщеславия.