1435 Stimmen

Wie man die IP-Adresse des Clients in PHP ermittelt

Wie kann ich die IP-Adresse des Clients mit PHP ermitteln?

Ich möchte den Benutzer, der sich auf meiner Website angemeldet hat, über seine IP-Adresse aufzeichnen.

1564voto

Emil Vikström Punkte 87499

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

Sie können sich aber auch hinter einem Proxy-Server befinden, in diesem Fall kann der Proxy die Einstellung $_SERVER['HTTP_X_FORWARDED_FOR'] Dieser Wert ist jedoch leicht zu fälschen. Er kann zum Beispiel von jemandem ohne Proxy gesetzt werden, oder die IP kann eine interne IP aus dem LAN hinter dem Proxy sein.

Das bedeutet, dass Sie, wenn Sie die $_SERVER['HTTP_X_FORWARDED_FOR'] stellen Sie sicher, dass Sie auch 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 Zeichenkette speichern wollen, stellen Sie sicher, dass Sie Platz für mindestens 45 Zeichen . IPv6 ist auf dem Vormarsch, und diese Adressen sind größer als die älteren IPv4-Adressen.

(Beachten Sie, dass IPv6 in der Regel maximal 39 Zeichen verwendet, aber es gibt auch eine spezielle IPv6-Notation für IPv4-Adressen der in seiner 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 einfach festlegen und vergessen wollen, verwenden Sie 45).

553voto

Tim Kennedy Punkte 5612

$_SERVER['REMOTE_ADDR'] enthält möglicherweise nicht die tatsächlichen IP-Adressen der Clients, da sie beispielsweise eine Proxy-Adresse für Clients enthält, die über einen Proxy verbunden sind. Das kann das sein, was Sie wirklich wollen, je nachdem, was Sie mit den IPs machen. Die private RFC1918-Adresse einer Person nützt Ihnen möglicherweise nichts, wenn Sie z. B. herausfinden wollen, woher Ihr Datenverkehr stammt, oder wenn Sie wissen wollen, von welcher IP aus sich der Benutzer zuletzt verbunden hat.

Es gibt mehrere HTTP-Header wie X-Forwarded-For die von verschiedenen Bevollmächtigten festgelegt werden können oder auch nicht. Das Problem ist, dass es sich dabei lediglich um HTTP-Header handelt, 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 sind nur willkürliche und freiwillige Angaben. Es gibt nur ein Szenario, in dem Sie diesen Informationen vertrauen können: Sie kontrollieren den Proxy, der diese Kopfzeile setzt. Das heißt, nur wenn Sie zu 100 % wissen, wo und wie der Header gesetzt wurde, sollten Sie ihn für irgendetwas Wichtiges beachten.

Nachfolgend finden Sie einige Codebeispiele:

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 Sicherheitsimplikationen . Der Client kann alle HTTP-Header-Informationen (z. B. $_SERVER['HTTP_... ) auf jeden beliebigen Wert setzen. Daher ist es viel zuverlässiger, wenn man $_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

239voto

lemon Punkte 8957

162voto

josh123a123 Punkte 1943

Hier ist ein Beispiel für einen sauberen Code, mit dem die IP-Adresse des Benutzers ermittelt werden kann.

$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 Hinweise zu entfernen (vielen Dank, @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']);

107voto

Kyle Cronin Punkte 74993

Sie sollte in der $_SERVER['REMOTE_ADDR'] variabel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X