Frage Wie bekomme ich die Client-IP-Adresse in PHP?


Wie kann ich die Client-IP-Adresse mit PHP erhalten?

Ich möchte den Benutzer aufzeichnen, der sich über seine IP-Adresse in meine Website eingeloggt hat.


977
2018-06-09 04:50


Ursprung


Antworten:


Was auch immer Sie tun, stellen Sie sicher, dass Sie keine vom Client gesendeten Daten als vertrauenswürdig einstufen. $_SERVER['REMOTE_ADDR'] enthält die reale IP-Adresse des Anschlusspartners. Das ist der zuverlässigste Wert, den Sie finden können.

Sie können sich jedoch hinter einem Proxy-Server befinden. In diesem Fall kann der Proxy den Proxyserver festgelegt haben $_SERVER['HTTP_X_FORWARDED_FOR'], aber dieser Wert ist leicht gefälscht. Zum Beispiel kann es von jemandem ohne einen Proxy eingestellt werden, oder die IP kann eine interne IP aus dem LAN hinter dem Proxy sein.

Dies bedeutet, dass wenn Sie die $_SERVER['HTTP_X_FORWARDED_FOR'], Stell sicher, dass du ebenfalls speichern Sie die $_SERVER['REMOTE_ADDR'] Wert. Z.B. indem Sie beide Werte in verschiedenen Feldern in Ihrer Datenbank speichern.

Wenn Sie die IP in einer Datenbank als Zeichenfolge speichern möchten, stellen Sie sicher, dass Sie mindestens Platz haben 45 Zeichen. IPv6 ist hier zu bleiben und diese Adressen sind größer als die älteren IPv4-Adressen.

(Beachten Sie, dass IPv6 normalerweise höchstens 39 Zeichen verwendet, aber es gibt auch ein spezielles IPv6-Notation für IPv4-Adressen was in seiner vollen Form bis zu 45 Zeichen sein kann. Also, wenn Sie wissen, was Sie tun, können Sie 39 Zeichen verwenden, aber wenn Sie es nur festlegen und vergessen möchten, verwenden Sie 45).


1163
2018-06-09 05:15



$_SERVER['REMOTE_ADDR'] enthält möglicherweise keine echten Client-IP-Adressen, da Sie beispielsweise eine Proxy-Adresse für Clients erhalten, die über einen Proxy verbunden sind. Das könnte Nun, was du wirklich willst, hängt davon ab, was du mit den IPs machst. Die private RFC1918-Adresse von jemandem hilft Ihnen möglicherweise nicht, wenn Sie sagen, dass Sie herausfinden möchten, woher Ihr Datenverkehr stammt oder an welche IP-Adresse der Benutzer zuletzt angeschlossen hat, wo die öffentliche IP des Proxy- oder NAT-Gateways die bessere sein könnte angemessen zu speichern.

Es gibt mehrere HTTP-Header wie X-Forwarded-For die von verschiedenen Proxies festgelegt werden können oder nicht. Das Problem ist, dass das nur HTTP-Header sind, die von jedem gesetzt werden können. Es gibt keine Garantie für ihren Inhalt. $_SERVER['REMOTE_ADDR'] ist die tatsächliche physikalische IP-Adresse, von der der Webserver die Verbindung erhalten hat und an die die Antwort gesendet wird. Alles andere ist nur willkürliche und freiwillige Information. Es gibt nur ein Szenario, in dem Sie diesen Informationen vertrauen können: Sie steuern den Proxy, der diesen Header festlegt. Das bedeutet nur, wenn Sie 100% wissen, wo und wie der Header gesetzt wurde, sollten Sie es für etwas Wichtiges beachten.

Nachdem das gesagt wurde, hier ein Beispielcode:

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

Anmerkung der Redaktion: Die Verwendung des obigen Codes hat Auswirkungen auf die Sicherheit. Der Client kann alle HTTP-Headerinformationen festlegen (d. H. $_SERVER['HTTP_...) zu jedem beliebigen Wert, den es haben will. Als solche ist es viel zuverlässiger zu verwenden $_SERVER['REMOTE_ADDR'], da dies vom Benutzer nicht eingestellt werden kann.

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


376
2017-09-11 04:01



echo $_SERVER['REMOTE_ADDR'];

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


185
2018-06-09 04:51



Es sollte in der enthalten sein $_SERVER['REMOTE_ADDR'] Variable.


79
2017-09-11 03:38



Hier ist ein saubereres Codebeispiel für eine gute Möglichkeit, die IP des Benutzers zu erhalten.

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

Hier ist eine kürzere Version, die den elvis-Operator verwendet

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

Hier ist eine Version, die isset verwendet, um Benachrichtigungen zu entfernen (Danke, @shasi kanth)

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

79
2017-10-08 16:20



Meine Lieblingslösung ist die Art, wie Zend Framework 2 verwendet wird. Es berücksichtigt auch die $_SERVER Eigenschaften HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, REMOTE_ADDR aber es deklariert eine Klasse, um einige vertrauenswürdige Proxies zu setzen, und es gibt eine IP-Adresse und kein Array zurück. Ich denke, das ist die Lösung, die ihr am nächsten kommt:

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 -- i.e., 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;
    }

    // [...]
}

Siehe den vollständigen Code hier: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php


47
2017-07-07 09:02



Es gibt verschiedene Arten von Benutzern hinter dem Internet, also wollen wir die IP-Adresse von verschiedenen Tränken abfangen. Das sind,

1. $_SERVER['REMOTE_ADDR'] - Dies enthält die reale IP-Adresse des Clients. Das ist der zuverlässigste Wert, den Sie vom Benutzer finden können.

2. $_SERVER['REMOTE_HOST'] - Dadurch wird der Host-Name abgerufen, von dem aus der Benutzer die aktuelle Seite anzeigt. Damit dieses Skript funktioniert, müssen Hostname-Lookups in der Datei httpd.conf konfiguriert werden.

3. $_SERVER['HTTP_CLIENT_IP'] - Dadurch wird die IP-Adresse abgerufen, wenn der Benutzer von den Shared Internet-Diensten kommt.

4. $_SERVER['HTTP_X_FORWARDED_FOR'] - Dadurch wird die IP-Adresse vom Benutzer abgerufen, wenn er sich hinter dem Proxy befindet

So können wir diese folgende kombinierte Funktion verwenden, um die echte IP-Adresse von Benutzern zu erhalten, die sich in verschiedenen Positionen befinden,

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

34
2017-12-29 15:18



Dies ist die fortschrittlichste Methode, die ich gefunden habe, bereits einige andere in der Vergangenheit versucht. Gültig, um die IP-Adresse des Besuchers zu erhalten (aber bitte beachten Sie, dass jeder Hacker die IP-Adresse leicht verfälschen könnte).

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

Quelle: http://blackbe.lt/advanced-method-to-obtain-the-client-ip-in-php/


29
2018-01-29 14:37



Die Antwort ist zu verwenden $_SERVER Variable. Beispielsweise, $_SERVER["REMOTE_ADDR"] würde die IP-Adresse des Clients zurückgeben.


26
2018-06-09 04:56



Dies ist die Methode, die ich verwende, und validiert ein IPv4 Eingang:

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

9
2018-02-13 14:47