it-swarm.com.de

PHP genaueste/sicherste Möglichkeit, eine echte Benutzer-IP-Adresse im Jahr 2017 zu erhalten

Was ist der genaueste Weg, um die IP-Adresse des Benutzers 2017 über PHP zu erhalten?

Ich habe viele SO Fragen und Antworten dazu gelesen, aber die meisten Antworten sind alt und werden von Benutzern kommentiert, dass diese Wege unsicher sind.

Schauen Sie sich beispielsweise diese Frage an (2011): Wie erhalte ich die Client-IP-Adresse in PHP?

Tim Kennedys Antwort enthält eine Empfehlung zur Verwendung von etwas wie: 

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

Aber da ich viel gelesen habe, habe ich gesehen, dass die Verwendung von X_FORWARDED_FOR unsicher ist, wie der folgende Kommentar hervorhebt: 

Verwenden Sie den obigen Code NICHT, wenn Sie nicht genau wissen, was er tut! Ich habe gesehen MASSIVE Sicherheitslücken. Der Client kann das .__ einstellen. X-Forwarded-For oder der Client-IP-Header auf einen beliebigen Wert it will. Sofern Sie nicht über einen vertrauenswürdigen Reverse Proxy verfügen, sollten Sie keine .__ verwenden. dieser Werte.

Da ich nicht genau wusste, was es tut, möchte ich das Risiko nicht eingehen. Er sagte, es sei unsicher, bot jedoch keine sichere Methode, um die IP-Adresse des Benutzers zu erhalten.

Ich habe den einfachen $_SERVER['REMOTE_ADDR']; ausprobiert, aber dies gibt die falsche IP zurück. Ich habe dies getestet und meine echte IP folgt diesem Muster: 78.57.xxx.xxx, aber ich erhalte eine IP-Adresse wie: 81.7.xxx.xxx

Hast du irgendwelche Ideen?

17
Infinity

Kurze Antwort:  

$ip = $_SERVER['REMOTE_ADDR'];


Ab 2019 $_SERVER['REMOTE_ADDR']; ist die einzige zuverlässige Lösung, um Benutzern die IP-Adresse zu geben, es kann jedoch fehlerhafte Ergebnisse zeigen, wenn sich hinter einem Proxyserver befindet.
Alle anderen Lösungen implizieren Sicherheitsrisiken oder können leicht gefälscht werden .

15
Pedro Lobito

Aus einem Sicherheits-POV ist nothing außer $_SERVER['REMOTE_ADDR'] zuverlässig - das ist leider nur die einfache Wahrheit.

Alle Variablen, denen HTTP_ vorangestellt ist, sind tatsächlich vom Client gesendete HTTP-Header. Es gibt keine andere Möglichkeit, diese Informationen zu übertragen, während Anforderungen verschiedene Server durchlaufen.
Aber das bedeutet natürlich automatisch, dass Kunden diese Header spoofen können. 

Sie können never, ever dem Kunden vertrauen.

Es sei denn, Sie sind es ... Wenn Sie den Proxy oder den Lastausgleich steuern, können Sie ihn so konfigurieren, dass er solche Header von der ursprünglichen Anforderung löscht.
.__ Dann und nur dann könnten Sie einem z.B. X-Client-IP -Header, aber zu diesem Zeitpunkt besteht keine Notwendigkeit ... Ihr Webserver kann auch so konfiguriert werden, dass er REMOTE_ADDR durch diesen Wert ersetzt, und der gesamte Prozess wird für Sie transparent.

Dies wird immer der Fall sein, egal in welchem ​​Jahr wir uns befinden ... für alles, was mit Sicherheit zu tun hat - vertrauen Sie nur REMOTE_ADDR.
Am besten ist es, die HTTP_-Daten für statistische Zwecke nur zu lesen, und selbst dann - stellen Sie sicher, dass die Eingabe mindestens eine gültige IP-Adresse ist.

9
Narf

Sie müssen mit Ihrem sysops-Team zusammenarbeiten (oder wenn Sie auch diesen Hut tragen, müssen Sie etwas recherchieren). Die Header-Prüfung wird verwendet, wenn Ihre Netzwerkinfrastruktur auf bestimmte Weise konfiguriert ist, wobei der Remote-Anforderer eine Ihrer Netzwerkgeräte ist und nicht der Endbenutzer.

Dies geschieht, wenn sich Ihre Webserver hinter einem Load Balancer oder einer Firewall oder einer anderen Appliance befinden, die die Nutzlast abfragen muss, um sie ordnungsgemäß abwickeln zu können. Ein Beispiel ist, wenn ein Lastenausgleichsserver ssl beendet hat und die Anforderung ohne ssl an den Webserver weiterleitet. In diesem Fall wird die Remote-Adresse zum Lastenausgleich. Dies geschieht auch bei Firewall-Appliances, die dasselbe tun. 

In den meisten Fällen bietet das Gerät die Konfiguration an, um einen Header-Wert in der Anforderung mit der ursprünglichen Remote-IP-Adresse festzulegen. Die Kopfzeile ist normalerweise das, was Sie erwarten würden, aber sie kann in einigen Fällen anders oder sogar konfigurierbar sein.

Je nach Ihrer Webserverkonfiguration (Apache, Nginx oder andere) werden bestimmte benutzerdefinierte Header wie der allgemeine IP-Header möglicherweise nicht unterstützt oder sind derzeit nicht dafür konfiguriert.

Der Punkt ist, dass Sie Ihre Netzwerkkonfiguration überprüfen müssen, um sicherzustellen, dass die IP des ursprünglichen Anforderers den gesamten Weg zu Ihrem Anwendungscode und in welcher Form durchläuft.

7
Jeremy Giberson

Wenn Sie eine vorgefertigte Bibliothek verwenden möchten, können Sie Whip verwenden. 

Die Verwendung vorgefertigter Bibliotheken ist normalerweise besser, da die meisten von einer aktiven Community sorgfältig geprüft wurden. Einige von ihnen, vor allem diejenigen, die seit langem auf dem Markt sind, haben mehr integrierte Funktionen.

Aber wenn Sie es selbst programmieren wollen, um das Konzept zu lernen, dann ist es in Ordnung, denke ich. Ich empfehle, es als eigenständige Bibliothek zu verpacken und als Open-Source zu veröffentlichen :)

BEARBEITEN: Ich empfehle die Verwendung der Remote-IP in Sicherheitsmechanismen nicht, da diese nicht immer zuverlässig sind.

5
aljo f

Erstens ist es unmöglich, die Quell-IP-Adresse einer Person zuverlässig zu bestimmen, wenn diese beabsichtigt, versteckt zu werden. Sogar etwas, das heute narrensicher erscheint, wird bald eine Lücke haben (wenn es nicht schon passiert). Als solche sollte jede Antwort unten als [~ # ~] nicht vertrauenswürdig [~ # ~] betrachtet werden, was bedeutet, dass Sie alle Ihre Eier hineinlegen Seien Sie darauf vorbereitet, dass jemand es ausnutzt oder es irgendwie umgeht.

Ich werde nicht auf alle Möglichkeiten eingehen, wie jemand das IP-Tracking umgehen kann, da es sich ständig weiterentwickelt. Was ich sagen werde ist, dass es ein nützliches Tool für die Protokollierung sein kann, solange Sie wissen, dass IP-Adressen leicht geändert oder auf andere Weise maskiert werden können.

Ein wichtiger Punkt ist, dass zwischen einer öffentlichen und einer privaten IP-Adresse ein Unterschied besteht. In IPV4 wird Routern im Allgemeinen eine öffentliche IP-Adresse zugewiesen. Dies ist alles, was eine serverseitige Sprache tatsächlich erfassen kann, da Ihre clientseitige IP-Adresse nicht angezeigt wird. Auf einem Server existiert Ihr Computer nicht als Webspace. Stattdessen ist Ihr Router alles, was zählt. Im Gegenzug kümmert sich nur Ihr Router um Ihren Computer und weist ihm eine private IP-Adresse (zu der Ihre 172. .. * -Adresse gehört) zu. um diese Arbeit zu machen. Dies ist gut für Sie, da Sie nicht direkt auf einen Computer hinter einem Router zugreifen können.

Wenn Sie auf eine private IP-Adresse zugreifen möchten, müssen Sie JavaScript (clientseitige Sprache) verwenden. Sie können die Daten dann asynchron über AJAX speichern. Soweit ich weiß, ist dies derzeit nur mit WebRTC-fähigen Chrome und Firefox. Siehe hier für eine Demo.

Ich habe dies getestet und es gibt private IP-Adressen zurück. Normalerweise wird dies von Werbetreibenden verwendet, um einzelne Nutzer in einem Netzwerk in Verbindung mit der öffentlichen IP-Adresse zu verfolgen. Ich bin mir sicher, dass es schnell unbrauchbar werden wird, wenn die Leute Abhilfemaßnahmen finden oder wenn ein öffentlicher Aufschrei sie zwingt, die WebRTC-API zu deaktivieren. Derzeit funktioniert es jedoch für alle, bei denen JavaScript auf Chrome und Firefox) aktiviert ist.

Mehr lesen:

4
smcjones

Da die eigentliche Methode darin besteht, die Benutzer-IP zu überprüfen, ist $ip = $_SERVER['REMOTE_ADDR']; 

Wenn der Benutzer ein VPN oder einen Proxy verwendet, wird die ursprüngliche IP-Adresse nicht erkannt. 

3
Narayan

Client-IP-Adresse abrufen:

<?php
 echo   $ip = $_SERVER['REMOTE_ADDR'];
?>

Hinweis:: Dies würde nur auf Live-Sites funktionieren, da Ihre IP auf Ihrem lokalen Host eine (1) der internen IP-Adressen wäre, wie z. B. 127.0.0.1 So ist seine Rückkehr :: 1

Beispiel:https://www.virendrachandak.com/demos/getting-real-client-ip-address-in-php.php

Es zeigt Ihre lokale IP: Wie ... 78.57.xxx.xxx

Beispiel:

<?php
$myIp= getHostByName(php_uname('n'));
 echo $myIp;
?>
2

Wie wäre es mit diesem -

public function getClientIP()
    {
        $remoteKeys = [
            'HTTP_X_FORWARDED_FOR',
            'HTTP_CLIENT_IP',
            'HTTP_X_FORWARDED',
            'HTTP_FORWARDED_FOR',
            'HTTP_FORWARDED',
            'REMOTE_ADDR',
            'HTTP_X_CLUSTER_CLIENT_IP',
        ];

        foreach ($remoteKeys as $key) {
            if ($address = getenv($key)) {
                foreach (explode(',', $address) as $ip) {
                    if ($this->isValidIp($ip)) {
                        return $ip;
                    }
                }
            }
        }

        return '127.0.0.0';
    }


    private function isValidIp($ip)
    {
        if (!filter_var($ip, FILTER_VALIDATE_IP,
                FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
            && !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE)
        ) {
            return false;
        }

        return true;
    }
1
Selim Mahmud

Ich benutze diesen Code, und es funktioniert für mich. Schau es dir an.

<?php

// Gets client's IP.
$ip = getenv("HTTP_CLIENT_IP")?:
getenv("HTTP_X_FORWARDED_FOR")?:
getenv("HTTP_X_FORWARDED")?:
getenv("HTTP_FORWARDED_FOR")?:
getenv("HTTP_FORWARDED")?:
getenv("REMOTE_ADDR");

echo $ip;

?>

Hier , ein Arbeitsbeispiel. Ich hoffe es hilft!

0
KAZZABE