Ответ 1
Это должно быть то, что вы хотите:
$_SERVER['REMOTE_ADDR']
IP-адрес, с которого пользователь просматривает текущую страницу.
Я разработал PHP веб-сервис. Я хотел бы регистрировать все входящие соединения клиентов WS, которые используют этот веб-сервис. Как я могу получить IP-адрес клиента? Значение
$_SERVER['HTTP_CLIENT_IP']
кажется всегда пустым.
Это должно быть то, что вы хотите:
$_SERVER['REMOTE_ADDR']
IP-адрес, с которого пользователь просматривает текущую страницу.
На самом деле, я бы предложил использовать эту функцию, чтобы охватить все ваши базы, такие как люди, использующие прокси, общие сети и т.д.:
function getUserIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //if from shared
{
return $_SERVER['HTTP_CLIENT_IP'];
}
else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //if from a proxy
{
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
return $_SERVER['REMOTE_ADDR'];
}
}
Убедитесь, что не доверяете данным, отправленным с клиента. $_SERVER['REMOTE_ADDR']
содержит реальный IP-адрес подключающейся стороны. Это самое надежное значение, которое вы можете найти.
Однако они могут находиться за прокси-сервером, и в этом случае прокси-сервер может установить значение $_SERVER['HTTP_X_FORWARDED_FOR']
, но это значение легко подделать. Он может быть установлен кем-либо без прокси на любое значение, которое хочет пользователь, или IP может быть внутренним IP из локальной сети за прокси.
Это означает, что если вы собираетесь сохранить $_SERVER['HTTP_X_FORWARDED_FOR']
, убедитесь, что вы также сохранили значение $_SERVER['REMOTE_ADDR']
, например, сохраняя оба значения в разных полях в вашей базе данных.
Если вы собираетесь сохранить IP-адрес в базе данных в виде строки, убедитесь, что у вас есть место как минимум для 45 символов. IPv6 здесь, чтобы остаться, и эти адреса больше, чем старые адреса IPv4.
Функции getUserIpAddr() и getRealIpAddr() не являются надежными !
Единственный надежный IP-адрес от $ip = $_SERVER["REMOTE_ADDR"];
В противном случае любой может подделать свой IP-адрес, отправив, например, заголовок CLIENT_IP.
Это дополнение Firefox может помочь вам отправлять пользовательские заголовки. Отправка заголовка CLIENT_IP = xxxx на сервер, выполняющий любую из функций на этой странице, будет означать, что клиенты могут выбрать любой IP-адрес, который они хотят...
Используете ли вы какие-то рамки для вашего веб-сервиса? Я видел некоторые фреймворки (например, Agavi), которые намеренно удаляют все данные $ SERVER, потому что они хотят, чтобы вы использовали проверенные значения из сервиса фреймворка.
Если это не делает работу, я не знаю, что делает..
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');
}
Моя любимая функция:
public static function get_remote_ip() {
if(isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) {
return $_SERVER['REMOTE_ADDR'];
}
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
return null;
}
Вы можете попробовать
<?php
var_dump($_SERVER);
чтобы увидеть все варианты. Но на самом деле это также зависит от серверной части, в которой работает ваш скрипт. Это Apache?
<?php
$ip=$_SERVER['REMOTE_ADDR'];
echo "Your IP Address is $ip";
?>
и вставить в базу данных просто используйте $ ip
<?php
function getIP() {
$ip;
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else
$ip = "UNKNOWN";
return $ip;
}
//-----------------------------------------------
//Usage:
$client_ip=getIP();
echo "Your IP :".$client_ip;
?>