So erhalten Sie die Client-IP-Adresse in PHP

Lesezeit: 10 Minuten

1647079450 468 So erhalten Sie die Client IP Adresse in PHP
Anup Prakash

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

Ich möchte den Benutzer aufzeichnen, der sich mit seiner IP-Adresse auf meiner Website angemeldet hat.

  • Siehe RFC6302 zu Empfehlungen darüber, was zu protokollieren ist, und denken Sie insbesondere heutzutage daran, den Port und nicht nur die Adresse zu protokollieren.

    – Patrick Mevzek

    3. Januar 2018 um 20:05 Uhr

  • Ein Wort der Vorsicht für diejenigen, die nachverfolgen, dass ISPS in mehreren Regionen der Welt CGNAT verwenden, was es viel komplizierter macht, einer bloßen IP-Adresse zu vertrauen

    – Jonathan DS

    8. August 2018 um 15:13 Uhr

  • function getUserIpAddr(){ if(!empty($_SERVER[‘HTTP_CLIENT_IP’])){ $ip = $_SERVER[‘HTTP_CLIENT_IP’]; }elseif(!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])){ $ip = $_SERVER[‘HTTP_X_FORWARDED_FOR’]; }sonst{ $ip = $_SERVER[‘REMOTE_ADDR’]; } $ip zurückgeben; }

    Benutzer3562771

    5. April 2020 um 12:30 Uhr


  • Du solltest benutzen Abstrakte IP-Erkennung. Der Wert ist, dass Sie wissen, ob sich die IP hinter einem Proxy oder einem VPN befindet, was ich für wichtig halte. Sie haben ein PHP-Snippet, aus dem Sie Ihre Anfrage kopieren können.

    – Johnson23

    12. Februar 2021 um 10:56 Uhr


1647079451 542 So erhalten Sie die Client IP Adresse in PHP
Emil Vikström

Was auch immer Sie tun, stellen Sie sicher, dass Sie den vom Client gesendeten Daten nicht vertrauen. $_SERVER['REMOTE_ADDR'] enthält die echte IP-Adresse des Verbindungspartners. Das ist der zuverlässigste Wert, den Sie finden können.

Sie können sich jedoch hinter einem Proxy-Server befinden, in diesem Fall hat der Proxy möglicherweise die $_SERVER['HTTP_X_FORWARDED_FOR'], aber dieser Wert lässt sich leicht fälschen. Sie kann beispielsweise von jemandem ohne Proxy festgelegt werden, oder die IP kann eine interne IP aus dem LAN hinter dem Proxy sein.

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

Wenn Sie die IP-Adresse als Zeichenfolge in einer Datenbank speichern möchten, stellen Sie sicher, dass Sie Platz für mindestens haben 45 Zeichen. IPv6 ist hier, um 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 eine Besonderheit IPv6-Notation für IPv4-Adressen die in ihrer vollständigen Form bis zu 45 Zeichen lang sein kann. Wenn Sie also wissen, was Sie tun, können Sie 39 Zeichen verwenden, aber wenn Sie es nur einstellen und vergessen möchten, verwenden Sie 45).

  • Gute Antwort! Ich verwende bereits $_SERVER[‘REMOTE_ADDR’] für meinen Server, und ich finde es gut, dass Sie einen anderen Weg sowie die Vor- und Nachteile aufgenommen haben.

    – Blau

    22. Dezember 2014 um 21:46 Uhr

  • Notiz: REMOTE_ADDR könnte nicht enthalten die echte IP der TCP-Verbindung. Dies hängt ganz von Ihrem SAPI ab. Stellen Sie sicher, dass Ihr SAPI richtig konfiguriert ist $_SERVER['REMOTE_ADDR'] gibt tatsächlich die IP der TCP-Verbindung zurück. Andernfalls können einige schwerwiegende Sicherheitslücken entstehen, z. B. StackExchange, die früher gewährt wurden Admin-Zugriff durch Überprüfung REMOTE_ADDR um zu sehen, ob es mit “localhost” übereinstimmt, leider die SAPI-Konfiguration………………….. ………………………………..

    – Schrittmacher

    29. Juni 2015 um 4:26 Uhr


  • ……………………………………………. ……………………hatte eine Schwachstelle (es dauert HTTP_X_FORWARDED_FOR als Eingabe), die es Nicht-Administratoren ermöglicht, Administratorzugriff zu erhalten, indem sie die HTTP_X_FORWARDED_FOR Header. Siehe auch blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html

    – Schrittmacher

    29. Juni 2015 um 4:26 Uhr


  • @EmilVikström Ich habe versucht, alles zu wiederholen – $_SERVER[“HTTP_CLIENT_IP”]; $_SERVER[‘REMOTE_ADDR’]; $_SERVER[‘HTTP_X_FORWARDED_FOR’]; $_SERVER[‘HTTP_X_FORWARDED’]; $_SERVER[‘HTTP_FORWARDED_FOR’]; $_SERVER[‘HTTP_FORWARDED’]; und $_SERVER[‘HTTP_X_CLUSTER_CLIENT_IP’]; – Der EINZIGE, der einen IP-Wert von BEIDEN zurückgibt – Direkter Zugriff über meinen Browser und über einen Proxy-Server ist die REMOTE_ADDR-Variable. Rest alle 6 Variablen kommen als BLANKS. Was wird hier übersehen? …..

    – Aquaholic

    21. November 2021 um 14:39 Uhr


  • …..@Pacerier – alle Kommentare auch von Ihrer Seite zu dem oben Gesagten

    – Aquaholic

    21. November 2021 um 14:41 Uhr

1647079451 109 So erhalten Sie die Client IP Adresse in PHP
Tim Kennedy

$_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 kann jedoch durchaus das sein, was Sie wirklich wollen, je nachdem, was Sie mit den IPs machen. Die private RFC1918-Adresse von jemandem nützt Ihnen möglicherweise nichts, wenn Sie beispielsweise versuchen, zu sehen, woher Ihr Datenverkehr stammt, oder sich daran erinnern, von welcher IP der Benutzer zuletzt eine Verbindung hergestellt hat, wo die öffentliche IP des Proxys oder NAT-Gateways möglicherweise höher ist geeignet zu lagern.

Es gibt mehrere HTTP-Header wie X-Forwarded-For die von verschiedenen Proxys gesetzt werden können oder nicht. Das Problem ist, dass dies lediglich HTTP-Header sind, die von jedem gesetzt werden können. Es gibt keine Garantie für deren 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 sind nur willkürliche und freiwillige Angaben. Es gibt nur ein Szenario, in dem Sie diesen Informationen vertrauen können: Sie steuern den Proxy, der diesen Header festlegt. Das heißt, nur wenn Sie zu 100% wissen, wo und wie der Header gesetzt wurde, sollten Sie ihn für etwas Wichtiges beachten.

Abgesehen davon, hier ist 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 (dh. $_SERVER['HTTP_...) to any arbitrary value it wants. As such it’s far more reliable to use $_SERVER['REMOTE_ADDR']da dies nicht vom Benutzer eingestellt werden kann.

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

  • Verwenden Sie den obigen Code NICHT, es sei denn, Sie wissen genau, was er tut! Ich habe aufgrund dessen MASSIVE Sicherheitslücken gesehen. Der Kunde kann die einstellen X-Forwarded-For oder der Client-IP Header auf einen beliebigen Wert. Wenn Sie keinen vertrauenswürdigen Reverse-Proxy haben, sollten Sie keinen dieser Werte verwenden.

    – Janos Passtor

    25. Juni 2013 um 14:37 Uhr


  • In Bezug auf Janoszens Kommentar ist eine Option filter_var($_SERVER[‘REMOTE_ADDR’]FILTER_VALIDATE_IP).

    – verlorener Philosoph

    27. Januar 2014 um 21:28 Uhr


  • X-Forwarded-For kann mehrere IP-Adressen enthalten, die durch ein Komma getrennt sind; und sollte wirklich “geparst” und nicht für bare Münze genommen werden (AFAIK, es fast noch nie enthält eine einzelne IP).

    – Martin Tournij

    13. Februar 2014 um 14:51 Uhr

  • @lostphilosopher, das ist eine vernünftige Sache, und es wird es zuverlässiger machen, aber leider würde es immer noch Spoofing erlauben.

    – Tim Seguine

    16. April 2014 um 8:14 Uhr

  • Für eine Site mit skalierter Größe gibt es Load Balancer und/oder Reverse Proxys vor den Webanwendungsservern. Sie müssen diese Load Balancer oder Proxys so konfigurieren, dass sie alle externen X-Forwarded-For-Header entfernen und stattdessen ihre eigene IP-Adresse einfügen, die sie für den verbindenden Client sehen.

    – Jon Watte

    1. Dezember 2014 um 6:31 Uhr

echo $_SERVER['REMOTE_ADDR'];

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

  • Eigentlich möchte ich die IP-Adresse des Clients wissen, der meine Website nutzt. Nicht die Server-IP-Adressen, auf die meine Seiten hochgeladen oder ausgeführt wurden. Bitte helfen Sie mir.

    – Anup Prakash

    9. Juni 2010 um 5:00 Uhr

  • @Anup Prakash Das ist es – daher das “REMOTE” (aus der Perspektive des Skripts).

    – Artefakt

    9. Juni 2010 um 5:01 Uhr

  • Weil du auf localhost bist 😉

    – Ussama Dahnin

    8. Oktober 2013 um 8:33 Uhr

  • @SiKni8 ::1 ist das IPv6-Äquivalent von 127.0.0.1

    – Camilo Martin

    30. Dezember 2013 um 0:17 Uhr

  • @CamiloMartin du hast mir gerade etwas beigebracht. kühl!

    – Christian

    17. Oktober 2015 um 3:25 Uhr

1647079452 69 So erhalten Sie die Client IP Adresse in PHP
josh123a123

Hier ist ein saubereres Codebeispiel für eine gute Möglichkeit, die IP-Adresse des Benutzers abzurufen.

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_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_FORWARDED_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']);

1647079452 926 So erhalten Sie die Client IP Adresse in PHP
Kyle Cronin

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

Meine Lieblingslösung ist die Art und Weise, wie Zend Framework 2 verwendet. 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 festzulegen, und es gibt eine IP-Adresse zurück, kein Array. Ich denke, das ist die Lösung, die dem 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

1647079453 362 So erhalten Sie die Client IP Adresse in PHP
Peter Mortensen

Es gibt verschiedene Arten von Benutzern hinter dem Internet, daher möchten wir die IP-Adresse aus verschiedenen Teilen erfassen. Jene sind:

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

2. $_SERVER['REMOTE_HOST'] – Dadurch wird der Hostname abgerufen, von dem der Benutzer die aktuelle Seite anzeigt. Aber damit dieses Skript funktioniert, müssen Hostnamen-Lookups innerhalb von httpd.conf konfiguriert werden.

3. $_SERVER['HTTP_CLIENT_IP'] – Dadurch wird die IP-Adresse abgerufen, wenn der Benutzer von gemeinsam genutzten Internetdiensten stammt.

4. $_SERVER['HTTP_X_FORWARDED_FOR'] – Dadurch wird die IP-Adresse des Benutzers 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 an verschiedenen Positionen angezeigt werden.

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

  • Wirklich einfach zu fälschen. Ich habe es gerade auf meiner eigenen Website mit der Requestly Chrome-Erweiterung versucht, indem ich den Client-IP-Header auf “111.111.111.111” gesetzt habe.

    Benutzer5147563

    10. August 2017 um 12:50 Uhr

993340cookie-checkSo erhalten Sie die Client-IP-Adresse in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy