Client-IP in PHP: Wie man 2025 keine Fehler macht

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum „einfach REMOTE_ADDR“ nicht mehr funktioniert

Jeder PHP-Entwickler hat sich mindestens einmal gefragt: „Wie erhalte ich die IP-Adresse des Clients?“. Auf Stack Overflow sammelt dieses Thema Hunderttausende von Aufrufen, und unter der kanonischen Antwort gibt es Dutzende von Klarstellungen. Das Problem ist, dass im Jahr 2025 das einfache $_SERVER['REMOTE_ADDR'] nicht mehr ausreicht.

Moderne Websites laufen hinter CDNs (Cloudflare, Akamai), Load-Balancern und Proxy-Servern. Benutzer sitzen über VPN oder Tor. Und Angreifer haben gelernt, Header zu fälschen. Wenn Sie die echte IP-Adresse eines Besuchers ermitteln wollen – und dabei keine Tür für Angriffe öffnen möchten – müssen Sie bewährte Praktiken anwenden.

In diesem Artikel zeige ich, wie die IP-Ermittlung in PHP funktioniert, analysiere Fallstricke und gebe fertigen Code, den Sie im Jahr 2025 bedenkenlos verwenden können.



Wie „sieht“ PHP die IP-Adresse?

Wenn der Browser eine Anfrage an den Server sendet, füllt PHP automatisch das superglobale Array $_SERVER. Für die IP-Adresse des „Gesprächspartners“ ist der Schlüssel REMOTE_ADDR zuständig. In einer idealen Welt (ohne Proxy) ist dies die Client-IP:

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

Aber in der Realität steht hinter dem Server oft nginx, HAProxy oder Cloudflare. Dann zeigt REMOTE_ADDR die IP des Proxys an, nicht die des Benutzers. Die tatsächliche Adresse wird in HTTP-Headern übermittelt:

  • HTTP_X_FORWARDED_FOR – Standard-Header für Proxys;
  • HTTP_X_REAL_IP – wird von nginx verwendet;
  • HTTP_CF_CONNECTING_IP – spezifisch für Cloudflare;
  • HTTP_CLIENT_IP – selten, aber kommt vor.

Problem: Jeder dieser Header kann gefälscht werden. Wenn Sie $_SERVER['HTTP_X_FORWARDED_FOR'] ohne Prüfung vertrauen, kann ein Angreifer leicht eine fremde IP einschleusen.



REMOTE_ADDR vs. X-Forwarded-For: Wann was verwenden?

Hier ist die entscheidende Regel, die Ihnen Kopfschmerzen erspart:

  • Wenn die Website direkt auf dem Server ohne Proxy läuft – verwenden Sie nur REMOTE_ADDR.
  • Wenn die Website hinter einem vertrauenswürdigen Proxy (CDN, Load-Balancer) läuft – nehmen Sie die IP aus dem Header, aber nur nach Prüfung, dass die Anfrage tatsächlich von Ihrem Proxy kommt.

Im Jahr 2025 ist der De-facto-Standard X-Forwarded-For. Darin kann eine Kette von IPs stehen: client, proxy1, proxy2. Die erste Adresse ist die Client-IP, die letzte die Adresse des letzten Proxys.



Warum man X-Forwarded-For nicht blind vertrauen sollte?

Stellen Sie sich vor: Ein Angreifer sendet eine Anfrage mit dem Header X-Forwarded-For: 127.0.0.1. Wenn Ihr Code einfach $_SERVER['HTTP_X_FORWARDED_FOR'] liest, erhalten Sie 127.0.0.1 (localhost). Logs, Analysen, Geolokalisierung – alles ist kaputt. Schlimmer noch: Der Angreifer könnte die IP eines anderen Benutzers einschleusen, um sich als ihn auszugeben.

Lösung: Vertrauen Sie dem Header X-Forwarded-For nur dann, wenn REMOTE_ADDR der IP Ihres vertrauenswürdigen Proxys entspricht. Anders nicht.



Beste Praxis 2025: Universelle Funktion zur IP-Ermittlung

Ich habe eine bewährte Logik zusammengestellt, die alle modernen Gegebenheiten berücksichtigt. Die Funktion:

  1. Prüft, ob die Anfrage über vertrauenswürdige Proxys kommt (Sie geben deren Liste an).
  2. Wenn ja – extrahiert die erste IP aus X-Forwarded-For.
  3. Wenn nein – gibt REMOTE_ADDR zurück.
  4. Filtert private und reservierte Adressen (optional).
<?php/** * Ermittelt die echte IP-Adresse des Clients. *  * @param array $trustedProxies Liste der vertrauenswürdigen Proxy-IPs * @return string IP-Adresse oder '0.0.0.0' falls nicht ermittelbar */function getClientIP(array $trustedProxies = []): string {    $remoteAddr = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';                

Blogs

Buchempfehlungen