Intereting Posts
Сервер Socket PHP с Flash-клиентами Сделать вызов JQuery AJAX для определенных функций PHP Использование длинного опроса ajax для обновления ответа на моей странице с внешнего API PHP preg_match_all + str_replace Как отделить Microsoft Edge от Chrome в htaccess? Неустранимая ошибка: допустимый размер памяти 25165824 байт исчерпан (пытался выделить 31436096 байт) даты фильтрации. Cakephp возвращает массив вместо даты, это нормально? Как заменить слова вне двойных и одинарных кавычек Как назначить массив PHP массиву jQuery? Зарегистрированная администратором регистрация в Symfony2 / FosUSerBundle Неустранимая ошибка: использование $ this, если не в контексте объекта Запрос PHP и Mysql, используйте PHP для преобразования строк в столбцы PHP: Разделить многобайтовую строку (слово) на отдельные символы Запросить данные из формы с несколькими входами, использующими одно и то же имя Что такое SAPI и когда вы его используете?

Как получить IP-адрес клиента в PHP?

Как я могу получить IP-адрес клиента с помощью PHP?

Я хочу вести учет пользователя, который вошел в мой сайт через его / ее IP-адрес.

Независимо от того, что вы делаете, убедитесь, что вы не доверяете данным, отправленным с клиента. $_SERVER['REMOTE_ADDR'] содержит реальный IP-адрес соединительной стороны. Это самое надежное значение, которое вы можете найти.

Однако они могут находиться за прокси-сервером, и в этом случае прокси-сервер может установить $_SERVER['HTTP_X_FORWARDED_FOR'] , но это значение легко подделать. Например, он может быть установлен кем-то без прокси, или IP может быть внутренним IP-адресом из локальной сети за прокси-сервером.

Это означает, что если вы собираетесь сохранить $_SERVER['HTTP_X_FORWARDED_FOR'] , убедитесь, что вы также сохранили значение $_SERVER['REMOTE_ADDR'] . Например, сохраняя оба значения в разных полях в вашей базе данных.

Если вы собираетесь сохранить IP-адрес в базу данных в виде строки, убедитесь, что у вас есть место для не менее 45 символов . IPv6 здесь, чтобы остаться, и эти адреса больше, чем старые IPv4-адреса.

(Обратите внимание, что IPv6 обычно использует не более 39 символов, но есть также специальная нотация IPv6 для адресов IPv4, которая в полной форме может содержать до 45 символов. Поэтому, если вы знаете, что делаете, вы можете использовать 39 символов, но если вы просто хочу установить и забыть, используйте 45).

$_SERVER['REMOTE_ADDR'] может фактически не содержать реальные IP-адреса клиента, так как он даст вам прокси-адрес для клиентов, подключенных через прокси-сервер, например. Однако это может быть то, что вы действительно хотите, в зависимости от того, что вы делаете с IP-адресами. Частный адрес RFC1918 у кого-то может не принести вам пользы, если вы скажете, пытаясь узнать, откуда происходит ваш трафик, или вспомнить, какой IP-адрес был последним подключен к пользователю, где может быть больше общедоступный IP-адрес прокси-сервера или шлюза NAT подходящий для хранения.

Существует несколько HTTP-заголовков, таких как X-Forwarded-For которые могут устанавливаться или не устанавливаться различными прокси-серверами. Проблема в том, что это просто HTTP-заголовки, которые могут быть установлены кем угодно. Нет никаких гарантий относительно их содержания. $_SERVER['REMOTE_ADDR'] – это фактический физический IP-адрес, на который веб-сервер получил соединение и ответ будет отправлен. Все остальное – это произвольная и добровольная информация. Существует только один сценарий, в котором вы можете доверять этой информации: вы контролируете прокси-сервер, который устанавливает этот заголовок. Значение только в том случае, если вы знаете 100%, где и как был настроен заголовок, если вы прислушаетесь к нему для чего-то важного.

Сказав это, вот пример кода:

 if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } 

Примечание редактора: Использование вышеуказанного кода имеет последствия для безопасности . Клиент может установить всю информацию заголовка HTTP (то есть $_SERVER['HTTP_... ) для любого произвольного значения, которое он хочет. Таким образом, гораздо надежнее использовать $_SERVER['REMOTE_ADDR'] , поскольку пользователь не может установить его.

От: http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

Он должен содержаться в переменной $_SERVER['REMOTE_ADDR'] .

Вот пример чистого кода хорошего способа получить ip пользователя.

 $ip = $_SERVER['HTTP_CLIENT_IP']?$_SERVER['HTTP_CLIENT_IP']:($_SERVER['HTTP_X_FORWARDE‌​D_FOR']?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR']); 

Вот более короткая версия, в которой используется оператор elvis

 $_SERVER['HTTP_CLIENT_IP']?:($_SERVER['HTTP_X_FORWARDE‌​D_FOR']?:$_SERVER['REMOTE_ADDR']); 

Вот версия, которая использует isset для удаления уведомлений (спасибо, @shasi kanth)

 $ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']‌:isset($_SERVER['HTT‌​P_X_FORWARDE‌​D_FOR'‌​])?$_SERVER['HTTP_X_‌​FORWARDED_FOR']:$_SE‌​RVER['REMOTE_ADDR']; 

Моим любимым решением является использование Zend Framework 2. Он также рассматривает свойства $_SERVER HTTP_X_FORWARDED_FOR , HTTP_CLIENT_IP , REMOTE_ADDR но он объявляет класс для установки некоторых доверенных прокси и возвращает один IP-адрес, а не массив. Я думаю, что это самое близкое к нему решение:

 class RemoteAddress { /** * Whether to use proxy addresses or not. * * As default this setting is disabled - IP address is mostly needed to increase * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled * just for more flexibility, but if user uses proxy to connect to trusted services * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR']. * * @var bool */ protected $useProxy = false; /** * List of trusted proxy IP addresses * * @var array */ protected $trustedProxies = array(); /** * HTTP header to introspect for proxies * * @var string */ protected $proxyHeader = 'HTTP_X_FORWARDED_FOR'; // [...] /** * Returns client IP address. * * @return string IP address. */ public function getIpAddress() { $ip = $this->getIpAddressFromProxy(); if ($ip) { return $ip; } // direct IP address if (isset($_SERVER['REMOTE_ADDR'])) { return $_SERVER['REMOTE_ADDR']; } return ''; } /** * Attempt to get the IP address for a proxied client * * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2 * @return false|string */ protected function getIpAddressFromProxy() { if (!$this->useProxy || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies)) ) { return false; } $header = $this->proxyHeader; if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) { return false; } // Extract IPs $ips = explode(',', $_SERVER[$header]); // trim, so we can compare against trusted proxies properly $ips = array_map('trim', $ips); // remove trusted proxy IPs $ips = array_diff($ips, $this->trustedProxies); // Any left? if (empty($ips)) { return false; } // Since we've removed any known, trusted proxy servers, the right-most // address represents the first IP we do not know about -- ie, we do // not know if it is a proxy server, or a client. As such, we treat it // as the originating IP. // @see http://en.wikipedia.org/wiki/X-Forwarded-For $ip = array_pop($ips); return $ip; } // [...] } 

См. Полный код здесь: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php

Это самый продвинутый метод, который я нашел, уже пробовал некоторые другие в прошлом. Действительно, чтобы получить IP-адрес посетителя (но учтите, что любой хакер может легко фальсифицировать IP-адрес).

 function get_ip_address() { // check for shared internet/ISP IP if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) { return $_SERVER['HTTP_CLIENT_IP']; } // check for IPs passing through proxies if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // check if multiple ips exist in var if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) { $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); foreach ($iplist as $ip) { if (validate_ip($ip)) return $ip; } } else { if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; } } if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED'])) return $_SERVER['HTTP_X_FORWARDED']; if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR'])) return $_SERVER['HTTP_FORWARDED_FOR']; if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED'])) return $_SERVER['HTTP_FORWARDED']; // return unreliable ip since all else failed return $_SERVER['REMOTE_ADDR']; } /** * Ensures an ip address is both a valid IP and does not fall within * a private network range. */ function validate_ip($ip) { if (strtolower($ip) === 'unknown') return false; // generate ipv4 network address $ip = ip2long($ip); // if the ip is set and not equivalent to 255.255.255.255 if ($ip !== false && $ip !== -1) { // make sure to get unsigned long representation of ip // due to discrepancies between 32 and 64 bit OSes and // signed numbers (ints default to signed in PHP) $ip = sprintf('%u', $ip); // do private network range checking if ($ip >= 0 && $ip <= 50331647) return false; if ($ip >= 167772160 && $ip <= 184549375) return false; if ($ip >= 2130706432 && $ip <= 2147483647) return false; if ($ip >= 2851995648 && $ip <= 2852061183) return false; if ($ip >= 2886729728 && $ip <= 2887778303) return false; if ($ip >= 3221225984 && $ip <= 3221226239) return false; if ($ip >= 3232235520 && $ip <= 3232301055) return false; if ($ip >= 4294967040) return false; } return true; } 

источник: http://blackbe.lt/advanced-method-to-obtain-the-client-ip-in-php/

Ответ заключается в использовании переменной $_SERVER . Например, $_SERVER["REMOTE_ADDR"] вернет IP-адрес клиента.

В Интернете есть разные типы пользователей, поэтому мы хотим поймать IP-адрес из разных зелий. Которые,

1. $_SERVER['REMOTE_ADDR'] – содержит реальный IP-адрес клиента. Это самое надежное значение, которое вы можете найти у пользователя.

2. $_SERVER['REMOTE_HOST'] – При этом будет $_SERVER['REMOTE_HOST'] имя хоста, с которого пользователь просматривает текущую страницу. Но для того, чтобы этот скрипт работал, необходимо найти имя хоста на внутри httpd.conf.

3. $_SERVER['HTTP_CLIENT_IP'] этом пользователь будет $_SERVER['HTTP_CLIENT_IP'] IP-адрес, если пользователь находится в Интернете.

4. $_SERVER['HTTP_X_FORWARDED_FOR'] – это будет $_SERVER['HTTP_X_FORWARDED_FOR'] IP-адрес от пользователя, когда он находится за прокси-сервером

Таким образом, мы можем использовать эту следующую комбинированную функцию, чтобы получить реальный IP-адрес от пользователей, которые просматривают разные позиции,

 // Function to get the user IP address function getUserIP() { $ipaddress = ''; if (isset($_SERVER['HTTP_CLIENT_IP'])) $ipaddress = $_SERVER['HTTP_CLIENT_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; else if(isset($_SERVER['HTTP_X_FORWARDED'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED']; else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; else if(isset($_SERVER['HTTP_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; else if(isset($_SERVER['HTTP_FORWARDED'])) $ipaddress = $_SERVER['HTTP_FORWARDED']; else if(isset($_SERVER['REMOTE_ADDR'])) $ipaddress = $_SERVER['REMOTE_ADDR']; else $ipaddress = 'UNKNOWN'; return $ipaddress; } 

Как я знаю Самый простой способ получить IP-адрес посетителя / клиента – использовать переменные $ _SERVER ['REMOTE_ADDR'] или $ _SERVER ['REMOTE_HOST'] .

Однако иногда это не возвращает правильный IP-адрес посетителя, поэтому мы можем использовать некоторые другие переменные сервера для получения IP-адреса.

Ниже обе функции эквивалентны разнице только в том, как и откуда извлекаются значения.

getenv() используется для получения значения переменной среды в PHP.

 // Function to get the client IP address 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 – это массив, содержащий серверные переменные, созданные веб-сервером.

 // Function to get the client IP address function get_client_ip() { $ipaddress = ''; if (isset($_SERVER['HTTP_CLIENT_IP'])) $ipaddress = $_SERVER['HTTP_CLIENT_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; else if(isset($_SERVER['HTTP_X_FORWARDED'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED']; else if(isset($_SERVER['HTTP_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; else if(isset($_SERVER['HTTP_FORWARDED'])) $ipaddress = $_SERVER['HTTP_FORWARDED']; else if(isset($_SERVER['REMOTE_ADDR'])) $ipaddress = $_SERVER['REMOTE_ADDR']; else $ipaddress = 'UNKNOWN'; return $ipaddress; } 

Это метод, который я использую, и он проверяет вход IPv4 :

 // Get user IP address if ( isset($_SERVER['HTTP_CLIENT_IP']) && ! empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0'; } $ip = filter_var($ip, FILTER_VALIDATE_IP); $ip = ($ip === false) ? '0.0.0.0' : $ip; 

Мне нравится этот код:

 function getClientIP() { if (isset($_SERVER)) { if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) return $_SERVER["HTTP_X_FORWARDED_FOR"]; if (isset($_SERVER["HTTP_CLIENT_IP"])) return $_SERVER["HTTP_CLIENT_IP"]; return $_SERVER["REMOTE_ADDR"]; } if (getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR'); if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP'); return getenv('REMOTE_ADDR'); } 
  $_SERVER['REMOTE_ADDR']; 

Попробуй это

 $ip = ""; if (!empty($_SERVER["HTTP_CLIENT_IP"])) { //check for ip from share internet $ip = $_SERVER["HTTP_CLIENT_IP"]; } elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) { // Check for the Proxy User $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } else { $ip = $_SERVER["REMOTE_ADDR"]; } echo $ip; 

Ну, это можно просто сделать, используя переменную GLOBAL именем $_SERVER .

$_SERVER – это массив, который имеет имена атрибутов REMOTE_ADDR .

Просто назначьте его так: $userIp = $_SERVER['REMOTE_ADDR'];

или использовать его прямо как echo $_SERVER['REMOTE_ADDR']; или echo ($_SERVER['REMOTE_ADDR']);

Как говорили все остальные, вы можете использовать $_SERVER['REMOTE_ADDR']; для получения IP-адреса клиента.

Кроме того, если вам нужна дополнительная информация о пользователе, вы можете использовать это:

 <?php $ip='0.0.0.0'; $ip=$_SERVER['REMOTE_ADDR']; $clientDetails = json_decode(file_get_contents("http://ipinfo.io/$ip/json")); echo "You're logged in from: <b>" . $clientDetails->country . "</b>"; ?> 

Более подробная информация клиента находится в $ clientDetails.
Вы можете получить json-элементы, хранящиеся в переменной $ clientDetails следующим образом: $ clientDetails-> PostalCode / hostname / region / loc …

Я использую ipinfo.io для получения дополнительной информации.

Я надеюсь, что это помогает.

Следующая функция определяет все возможности и возвращает значение в разделенной запятой (ip, ip и т. Д.).

Он также имеет факультативную функцию проверки как (первый параметр, который по умолчанию отключен) для проверки IP-адреса в отношении (частный диапазон и зарезервированный диапазон).

 <?php echo GetClientIP(true); function GetClientIP($validate = False){ $ipkeys = array( 'REMOTE_ADDR', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP' ); /* now we check each key against $_SERVER if contain such value */ $ip = array(); foreach($ipkeys as $keyword){ if( isset($_SERVER[$keyword]) ){ if($validate){ if( ValidatePublicIP($_SERVER[$keyword]) ){ $ip[] = $_SERVER[$keyword]; } }else{ $ip[] = $_SERVER[$keyword]; } } } $ip = ( empty($ip) ? 'Unknown' : implode(", ", $ip) ); return $ip; } function ValidatePublicIP($ip){ if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { return true; } else { return false; } } 

Эта функция компактна, и ее можно использовать везде. Но !

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

Php Функция:

 function GetIP() { if ( getenv("HTTP_CLIENT_IP") ) { $ip = getenv("HTTP_CLIENT_IP"); } elseif ( getenv("HTTP_X_FORWARDED_FOR") ) { $ip = getenv("HTTP_X_FORWARDED_FOR"); if ( strstr($ip, ',') ) { $tmp = explode(',', $ip); $ip = trim($tmp[0]); } } else { $ip = getenv("REMOTE_ADDR"); } return $ip; } 

Применение :

$IP = GetIP(); или непосредственно GetIP();

 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; } 

Как это????

 if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',validate_ip))===false or empty($ip)){ exit; } echo $ip; 

PS

 if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',FILTER_VALIDATE_IP|FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE))===false){ header('HTTP/1.0 400 Bad Request'); exit; } 

Все заголовки, начинающиеся с «HTTP_» или «X-», могут быть обманом, соответственно, определены пользователем. Если вы хотите отслеживать использование cooies и т. Д.

Вот простой один вкладыш

 $ip = $_SERVER['HTTP_X_FORWARDED_FOR']?: $_SERVER['HTTP_CLIENT_IP']?: $_SERVER['REMOTE_ADDR']; 

РЕДАКТИРОВАТЬ:

Выше кода может возвращать зарезервированные адреса (например, 10.0.0.1), список адресов всех прокси-серверов на пути и т. Д. Для обработки этих случаев используйте следующий код:

 function valid_ip($ip) { // for list of reserved IP addresses, see https://en.wikipedia.org/wiki/Reserved_IP_addresses return $ip && substr($ip, 0, 4) != '127.' && substr($ip, 0, 4) != '127.' && substr($ip, 0, 3) != '10.' && substr($ip, 0, 2) != '0.' ? $ip : false; } function get_client_ip() { // using explode to get only client ip from list of forwarders. see https://en.wikipedia.org/wiki/X-Forwarded-For return @$_SERVER['HTTP_X_FORWARDED_FOR'] ? explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'], 2)[0] : @$_SERVER['HTTP_CLIENT_IP'] ? explode(',', $_SERVER['HTTP_CLIENT_IP'], 2)[0] : valid_ip(@$_SERVER['REMOTE_ADDR']) ?: 'UNKNOWN'; } echo get_client_ip(); 
 $_SERVER['REMOTE_ADDR']; 

Пример:

 if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; }