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

Я разработал PHP веб-сервис. Я хотел бы регистрировать все входящие соединения клиентов WS, которые используют этот веб-сервис. Как я могу получить IP-адрес клиента? Значение

$_SERVER['HTTP_CLIENT_IP']
кажется всегда пустым.

Ответы

Ответ 1

Это должно быть то, что вы хотите:

$_SERVER['REMOTE_ADDR']

IP-адрес, с которого пользователь просматривает текущую страницу.

http://php.net/manual/en/reserved.variables.server.php

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

Функции getUserIpAddr() и getRealIpAddr() не являются надежными !

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

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

Ответ 5

Используете ли вы какие-то рамки для вашего веб-сервиса? Я видел некоторые фреймворки (например, Agavi), которые намеренно удаляют все данные $ SERVER, потому что они хотят, чтобы вы использовали проверенные значения из сервиса фреймворка.

Ответ 6

Если это не делает работу, я не знаю, что делает..

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

Ответ 7

Моя любимая функция:

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

Ответ 8

Вы можете попробовать

<?php
var_dump($_SERVER);

чтобы увидеть все варианты. Но на самом деле это также зависит от серверной части, в которой работает ваш скрипт. Это Apache?

Ответ 9

<?php 
 $ip=$_SERVER['REMOTE_ADDR'];
 echo "Your IP Address is $ip"; 
 ?> 

и вставить в базу данных просто используйте $ ip

Ответ 10

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