Я хочу получить реальный IP-адрес от пользователей, идущих на моем сайте, даже если они используют прокси-сайт, например hidemyass.com
Это код, который у меня есть, и думал, что он сработал, но я его протестировал, и он не
<?php 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'])) //to check ip is pass from proxy { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } return $ip; } ?>
Я думал, что этот код будет работать, но прокси-сервер все равно обходит его.
Заранее спасибо.
Не существует гарантированного способа получить «реальный» IP-адрес, если прокси не хочет рассказывать вам об этом (и никакого истинного анонимного прокси не будет ).
Вы не можете. Информация у вас есть от apache / iis / whatever, и она знает только, кто говорит с вашим сервером, который в этом случае является прокси. Если прокси не хочет отправлять эту информацию в заголовке, вы не получите ее.
X-Forwarded-For – лучшее, что вы можете сделать, но вряд ли анонимный прокси отправит это.
Вы не можете получить «реальный» IP-адрес, если только вы не реализуете какой-то протокол проверки подлинности на прикладном уровне, который кодирует IP-адрес (который также подлежит spoofin).
Почему это?
Поскольку пакет данных IP может быть переписан произвольно кем-то «посередине», у которого есть доступ к нему. Например, прокси, маршрутизатор, шлюз и т. Д.
Пакет данных IP имеет такую структуру
| stuff | src ip | dst ip | stuff | | .... | 32-bits| 32 bits | stuff |
Итак, src ip – это только биты, помните – могут быть перезаписаны произвольно.
http://www.faqs.org/rfcs/rfc791.html предоставит больше информации.
Если прокси не помещает реальный IP-адрес в заголовки (общий – в зависимости от того, почему используется прокси) (как правило, в какой-то форме «X-something»), вы можете видеть только IP-адрес прокси-сервера.
Я нашел аналогичную запись здесь, чтобы проверить еще несколько заголовков, чтобы узнать, использует ли пользователь прокси-сервер, который может помочь
определить, использует ли пользователь прокси-сервер
Попробуйте это пожалуйста
function get_IP_address() { foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){ if (array_key_exists($key, $_SERVER) === true){ foreach (explode(',', $_SERVER[$key]) as $IPaddress){ $IPaddress = trim($IPaddress); // Just to be safe if (filter_var($IPaddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $IPaddress; } } } } }