Проблема получения реального IP-адреса в php

Я использую это, чтобы получить реальный IP-адрес, но я принимаю пусто от $_SERVER['HTTP_CLIENT_IP'] , я беру не пусто только из $_SERVER['REMOTE_ADDR'] Но мне не нужен IP-адрес прокси-сервера, мне нужен реальный ip компьютеров, использующих некоторую интрасеть. Могу я это получить? Когда $_SERVER['HTTP_CLIENT_IP'] не возвращается пустым?

 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 от $ip = $_SERVER["REMOTE_ADDR"]; В противном случае любой мог бы подделать свой IP-адрес, отправив, например, заголовок CLIENT_IP.

Этот Firefox Addon может помочь вам отправлять пользовательские заголовки. Отправка заголовка CLIENT_IP = xxxx на сервер, на котором выполняются какие-либо функции на этой странице, будет означать, что клиенты могут выбрать любой IP-адрес, который они хотят …

HTTP_CLIENT_IP не указан в документации $_SERVER … Он может быть доступен как переменная среды (под $_ENV ), но это не в $_SERVER . Метод, который вы используете (переход на HTTP_X_FORWARDED_FOR , а затем HTTP_X_FORWARDED_FOR на REMOTE_ADDR ) – это лучшее, что вы можете сделать …

Что вы делаете, это все, что вы можете сделать, чтобы получить эту информацию. Я не уверен на 100%, что вы говорите, но попробуйте 2 метода ниже, чтобы узнать, дают ли они вам другую / лучшую информацию.

Пытаться:

 $headers = apache_request_headers(); echo $headers['X-Forwarded-For']; 

Или:

 $ip_list = getenv('HTTP_X_FORWARDED_FOR'); echo $ip_list; 

Это невозможно решить в течение 100% времени, но это поможет вам приблизиться как можно ближе:

 if($_SERVER["HTTP_X_FORWARDED_FOR"]) { if($_SERVER["HTTP_CLIENT_IP"]) { $proxy = $_SERVER["HTTP_CLIENT_IP"]; } else { $proxy = $_SERVER["REMOTE_ADDR"]; } $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } else { if($_SERVER["HTTP_CLIENT_IP"]) { $ip = $_SERVER["HTTP_CLIENT_IP"]; } else { $ip = $_SERVER["REMOTE_ADDR"]; } } echo "IP resolved to: ".$ip." (could still be a proxy IP though)<br>"; if($proxy) echo "Proxied through: ".$proxy; 

Я думаю, что это один из лучших способов получить реальный ip

автор: oliver leuyim angel

 function getRealIP(){ if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' ) { $client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] :(( !empty($_ENV['REMOTE_ADDR']) ) ? $_ENV['REMOTE_ADDR'] : "unknown" ); // los proxys van añadiendo al final de esta cabecera // las direcciones ip que van "ocultando". Para localizar la ip real // del usuario se comienza a mirar por el principio hasta encontrar // una dirección ip que no sea del rango privado. En caso de no // encontrarse ninguna se toma como valor el REMOTE_ADDR $entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']); reset($entries); while (list(, $entry) = each($entries)){ $entry = trim($entry); if ( preg_match("/^([0-9]+.[0-9]+.[0-9]+.[0-9]+)/", $entry, $ip_list) ){ // http://www.faqs.org/rfcs/rfc1918.html $private_ip = array( '/^0./', '/^127.0.0.1/', '/^192.168..*/', '/^172.((1[6-9])|(2[0-9])|(3[0-1]))..*/', '/^10..*/'); $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]); if ($client_ip != $found_ip){ $client_ip = $found_ip; break; } } } } else { $client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : ( ( !empty($_ENV['REMOTE_ADDR']) ) ? $_ENV['REMOTE_ADDR'] : "unknown" ); if ($client_ip == 'unknown') { 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']; } $client_ip = $ip; } } return $client_ip; } 

Анонимные прокси-серверы не будут заполнять HTTP_X_FORWARDED_FOR или REMOTE_ADDR или заполнять их, используя их собственные IP-адреса, а не IP-адрес клиента.

Если вы работаете над чем-то, где вы абсолютно должны идентифицировать IP-адрес шлюза, который использует клиентский компьютер, и ему приходится иметь дело с ситуациями, в которых используются прокси-серверы анонимности, вам придется придумать что-то еще. В прошлом я использовал flash для подключения сокета к серверу и отправки уникального ключа, предоставленного во флэш-память через параметры.

Имейте в виду, что это не идеальное решение. Но в том случае, когда я использовал его, чтобы предотвратить мошенничество в приложении для голосования, он работал нормально. Нет вспышки, нет голоса. Аналогичные вещи можно сделать с помощью апплетов Java, silverlight и т. Д. Любой клиентский техник, где вы можете указать порт, с которым вы разговариваете с сервером. Вы не хотите использовать 80, 8080 и т. Д., Любой из общих портов прокси.