Как получить реальный IP посетителя? [дубликат]
этот вопрос уже есть ответ здесь:
Как получить IP-адрес клиента в PHP?
23 ответов
Я использую этот PHP-код, чтобы получить IP-адрес посетителя:
<?php echo $_SERVER['REMOTE_ADDR']; ?>
но, я не могу получить реальный IP-адрес от посетителей когда они используют прокси-сервера. Есть ли способ получить IP-адрес посетителя в данном случае?
10 ответов:
попробуйте этот php код.
<?PHP function getUserIP() { // Get real visitor IP behind CloudFlare network if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) { $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"]; $_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"]; } $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = $_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)) { $ip = $client; } elseif(filter_var($forward, FILTER_VALIDATE_IP)) { $ip = $forward; } else { $ip = $remote; } return $ip; } $user_ip = getUserIP(); echo $user_ip; // Output IP address [Ex: 177.87.193.134] ?>
Это самый распространенный метод, который я видел:
function getUserIP() { if( array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) { if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')>0) { $addr = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']); return trim($addr[0]); } else { return $_SERVER['HTTP_X_FORWARDED_FOR']; } } else { return $_SERVER['REMOTE_ADDR']; } }обратите внимание, что это не гарантирует, что вы всегда получите правильный IP-адрес пользователя, потому что есть много способов его скрыть.
Это мой подход:
function getRealUserIp(){ switch(true){ case (!empty($_SERVER['HTTP_X_REAL_IP'])) : return $_SERVER['HTTP_X_REAL_IP']; case (!empty($_SERVER['HTTP_CLIENT_IP'])) : return $_SERVER['HTTP_CLIENT_IP']; case (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) : return $_SERVER['HTTP_X_FORWARDED_FOR']; default : return $_SERVER['REMOTE_ADDR']; } }Как использовать:
$ip = getRealUserIp();
прокси могут отправить но даже это необязательно.
также имейте в виду, что посетители могут обмениваться IP-адресами; университетские сети, крупные компании и интернет-провайдеры третьего мира/с низким бюджетом, как правило, используют IP-адреса для многих пользователей.
применить этот код для получения ipaddress:
if (getenv('HTTP_X_FORWARDED_FOR')) { $pipaddress = getenv('HTTP_X_FORWARDED_FOR'); $ipaddress = getenv('REMOTE_ADDR'); echo "Your Proxy IP address is : ".$pipaddress. "(via $ipaddress)" ; } else { $ipaddress = getenv('REMOTE_ADDR'); echo "Your IP address is : $ipaddress"; } ------------------------------------------------------------------------
Это моя функция.
преимущества :
- работать, если $_SERVER не был доступен.
- фильтр частных и / или зарезервированных IP-адресов;
- обрабатывать все пересылаемые IP-адреса в X_FORWARDED_FOR
- совместимость с CloudFlare
- можно установить значение по умолчанию, если не найден действительный IP!
- Короткий И Простой !
/** * Get real user ip * * Usage sample: * GetRealUserIp(); * GetRealUserIp('ERROR',FILTER_FLAG_NO_RES_RANGE); * * @param string $default default return value if no valid ip found * @param int $filter_options filter options. default is FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE * * @return string real user ip */ function GetRealUserIp($default = NULL, $filter_options = 12582912) { $HTTP_X_FORWARDED_FOR = isset($_SERVER)? $_SERVER["HTTP_X_FORWARDED_FOR"]:getenv('HTTP_X_FORWARDED_FOR'); $HTTP_CLIENT_IP = isset($_SERVER)?$_SERVER["HTTP_CLIENT_IP"]:getenv('HTTP_CLIENT_IP'); $HTTP_CF_CONNECTING_IP = isset($_SERVER)?$_SERVER["HTTP_CF_CONNECTING_IP"]:getenv('HTTP_CF_CONNECTING_IP'); $REMOTE_ADDR = isset($_SERVER)?$_SERVER["REMOTE_ADDR"]:getenv('REMOTE_ADDR'); $all_ips = explode(",", "$HTTP_X_FORWARDED_FOR,$HTTP_CLIENT_IP,$HTTP_CF_CONNECTING_IP,$REMOTE_ADDR"); foreach ($all_ips as $ip) { if ($ip = filter_var($ip, FILTER_VALIDATE_IP, $filter_options)) break; } return $ip?$ip:$default; }
Если прокси-сервер, которому Вы доверяете, вы можете попробовать: (предположим, что IP-адрес прокси-сервера
151.101.2.10)<?php $trustProxyIPs = ['151.101.2.10']; $clientIP = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL; if (in_array($clientIP, $trustProxyIPs)) { $headers = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR']; foreach ($headers as $key => $header) { if (isset($_SERVER[$header]) && filter_var($_SERVER[$header], FILTER_VALIDATE_IP)) { $clientIP = $_SERVER[$header]; break; } } } echo $clientIP;Это предотвратит подделку прямого заголовка прямыми запрошенными клиентами и получит реальный IP-адрес через доверенные Прокси.
да
$_SERVER["HTTP_X_FORWARDED_FOR"]Это то, как я вижу свой ip, когда под прокси на моем сервере nginx.но лучше всего бежать
phpinfo()на странице, запрошенной из-под прокси, чтобы вы могли посмотреть на все доступные переменные и посмотреть, что такое тот, который несет ваш реальный ip.
<?php function getrealip() { if (isset($_SERVER)){ if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; if(strpos($ip,",")){ $exp_ip = explode(",",$ip); $ip = $exp_ip[0]; } }else if(isset($_SERVER["HTTP_CLIENT_IP"])){ $ip = $_SERVER["HTTP_CLIENT_IP"]; }else{ $ip = $_SERVER["REMOTE_ADDR"]; } }else{ if(getenv('HTTP_X_FORWARDED_FOR')){ $ip = getenv('HTTP_X_FORWARDED_FOR'); if(strpos($ip,",")){ $exp_ip=explode(",",$ip); $ip = $exp_ip[0]; } }else if(getenv('HTTP_CLIENT_IP')){ $ip = getenv('HTTP_CLIENT_IP'); }else { $ip = getenv('REMOTE_ADDR'); } } return $ip; } $MyipAddress = getrealip(); echo $MyipAddress; // IP: 58.97.178.57 ?>Это выход
это работает для Windows и Linux! Это не имеет значения, если это localhost или онлайн..
function getIP() { $ip = $_SERVER['SERVER_ADDR']; if (PHP_OS == 'WINNT'){ $ip = getHostByName(getHostName()); } if (PHP_OS == 'Linux'){ $command="/sbin/ifconfig"; exec($command, $output); // var_dump($output); $pattern = '/inet addr:?([^ ]+)/'; $ip = array(); foreach ($output as $key => $subject) { $result = preg_match_all($pattern, $subject, $subpattern); if ($result == 1) { if ($subpattern[1][0] != "127.0.0.1") $ip = $subpattern[1][0]; } //var_dump($subpattern); } } return $ip; }
Comments