Я использую этот код PHP для получения IP-адреса посетителя:
<?php echo $_SERVER['REMOTE_ADDR']; ?>
Но я не могу получить реальный IP-адрес от посетителей, когда они используют прокси-сервер . Есть ли способ получить IP-адрес посетителя в этом случае?
Попробуйте этот PHP-код.
<?PHP function getUserIP() { $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();
Прокси могут отправлять заголовок HTTP_X_FORWARDED_FOR
но даже это необязательно.
Также имейте в виду, что посетители могут обмениваться 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"; } ------------------------------------------------------------------------
Это моя функция.
выгоды :
/** * 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-адреса клиента
function get_client_ip() { $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; return $ipaddress; }
Да, $_SERVER["HTTP_X_FORWARDED_FOR"]
– это то, как я вижу свой ip, когда под прокси-сервером на моем сервере nginx.
Но лучше всего запустить phpinfo()
на странице, запрошенной из прокси-сервера, чтобы вы могли просмотреть все переменные availabe и посмотреть, что именно несет ваш реальный 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; }
Если доверенное устройство доверяет вам, вы можете попробовать: (Предположите, что прокси- 151.101.2.10
равен 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-адреса через доверенные прокси.