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


Answers

$_SERVER['REMOTE_ADDR'] möglicherweise keine echten Client-IP-Adressen, da Sie beispielsweise eine Proxy-Adresse für Clients erhalten, die über einen Proxy verbunden sind. Das kann gut sein, was Sie wirklich wollen, abhängig davon, was Sie mit den IPs machen. 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 gesetzt 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 physische 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 des Herausgebers: Die Verwendung des obigen Codes hat Auswirkungen auf die Sicherheit . Der Client kann alle HTTP-Header-Informationen (z. $_SERVER['HTTP_... ) auf einen beliebigen beliebigen Wert setzen. Daher ist es wesentlich zuverlässiger, $_SERVER['REMOTE_ADDR'] , da dies vom Benutzer nicht festgelegt werden kann.

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

Question

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.




Es sollte in der Variablen $_SERVER['REMOTE_ADDR'] .




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

    // [...]
}

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




$_SERVER['REMOTE_ADDR'];

Beispiel:

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



Wie alle anderen zuvor gesagt haben, können Sie $_SERVER['REMOTE_ADDR']; um die Client-IP-Adresse zu erhalten.

Wenn Sie weitere Informationen zu einem Benutzer benötigen, können Sie Folgendes verwenden:

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

Die spezifischeren Informationen des Kunden gehen in $ clientDetails.
Sie können JSON-Elemente, die in der Variablen $ clientDetails gespeichert sind, folgendermaßen abrufen: $ clientDetails-> PostalCode / hostname / region / loc ...

Ich verwende ipinfo.io , um zusätzliche Informationen zu erhalten.

Ich hoffe, es hilft.




Diese Funktion ist kompakt und Sie können sie überall verwenden. Aber !

Vergiss das nicht! Bei dieser Art von Funktionen oder Code-Blöcken nicht für die Aufnahme der User Real IP garantieren, weil einige Benutzer Proxy oder eine andere sichere Gateways für unsichtbar sein können oder nicht verfolgen können

PHP Funktion:

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

Verwendung :

$IP = GetIP(); oder direkt GetIP();




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




 $_SERVER['REMOTE_ADDR'];

Probier diese




So wie das????

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

Alle Kopfzeilen, die mit "HTTP_" oder "X-" beginnen, können gefälscht bzw. benutzerdefiniert sein. Wenn Sie den Überblick behalten möchten, verwenden Sie cookies usw.




Wie ich weiß Die einfachste Möglichkeit, die IP-Adresse des Besuchers / Kunden zu erhalten, ist die Verwendung der Variablen $ _SERVER ['REMOTE_ADDR'] oder $ _SERVER ['REMOTE_HOST'] .

Manchmal gibt dies jedoch nicht die korrekte IP-Adresse des Besuchers zurück, so dass wir einige andere Servervariablen verwenden können, um die IP-Adresse zu erhalten.

Die folgenden beiden Funktionen sind äquivalent mit dem Unterschied nur in wie und woher die Werte abgerufen werden.

getenv() wird verwendet, um den Wert einer Umgebungsvariablen in PHP zu erhalten.

// 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 ist ein Array, das Servervariablen enthält, die vom Webserver erstellt wurden.

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



Ich mag diesen Codesnippet:

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