PHP get real-IP (proxy-Erkennung)

Ich bekomme den Pfad "echte" IP von einem user, wenn er einen proxy wich sendet den header der echte IP... hat eine bessere Lösung, oder sogar noch mehr Header?

Da diese Funktion sehr Häufig verwendet wird in dem Skript, es muss sehr schnell sein, und es scheint nicht in dieser Konstellation :/

Ein paar Vorschläge, die ich kam mit, konnte aber nicht erkennen:

  • setzen der Header in der Reihenfolge, was wird am meisten "in the wild", sothat die Funktionen beendet schnell
  • machen die pre_match-Erkennung für IP-schneller

===

function get_real_ip()
{
  $proxy_headers = array(
                          'CLIENT_IP', 
                          'FORWARDED', 
                          'FORWARDED_FOR', 
                          'FORWARDED_FOR_IP', 
                          'HTTP_CLIENT_IP', 
                          'HTTP_FORWARDED', 
                          'HTTP_FORWARDED_FOR', 
                          'HTTP_FORWARDED_FOR_IP', 
                          'HTTP_PC_REMOTE_ADDR', 
                          'HTTP_PROXY_CONNECTION',
                          'HTTP_VIA', 
                          'HTTP_X_FORWARDED', 
                          'HTTP_X_FORWARDED_FOR', 
                          'HTTP_X_FORWARDED_FOR_IP', 
                          'HTTP_X_IMFORWARDS', 
                          'HTTP_XROXY_CONNECTION', 
                          'VIA', 
                          'X_FORWARDED', 
                          'X_FORWARDED_FOR'
                         );

  foreach($proxy_headers as $proxy_header)
  {
    if(isset($_SERVER[$proxy_header]) && preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $_SERVER[$proxy_header])) /* HEADER ist gesetzt und dies ist eine gültige IP */
    {
        return $_SERVER[$proxy_header];
    }
    else if(stristr(',', $_SERVER[$proxy_header]) !== FALSE) /* Behandle mehrere IPs in einer Anfrage(z.B.: X-Forwarded-For: client1, proxy1, proxy2) */
    {
      $proxy_header_temp = trim(array_shift(explode(',', $_SERVER[$proxy_header]))); /* Teile in einzelne IPs, gib die letzte zurück und entferne Leerzeichen */

      if(($pos_temp = stripos($proxy_header_temp, ':')) !== FALSE) $proxy_header_temp = substr($proxy_header_temp, 0, $pos_temp); /* Entferne den Port */

      if(preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $proxy_header_temp) return $proxy_header_temp;
    }
  }

  return $_SERVER['REMOTE_ADDR'];
}
  • ereg ist veraltet. Außerdem.. muss man immer zum speichern sowohl der real-ip-und der "proxy" die ip als Benutzer können fügen Sie einfach diese Kopfzeilen auf Ihre eigenen.
  • Vielen Dank, ersetzt die ereg mit dem (eventuell schneller) preg_match und noch ein Teil zu erkennen, wenn das Feld hat mehrere IPs, die etwa so aussieht: en.wikipedia.org/wiki/X-Forwarded-For
  • Meine echte IP wird 192.168.0.81. Ich bin neugierig, wird es verwendet?
  • was bedeutet es, "sehr oft benutzt im Skript"? gibt es irgendeinen Grund zu laufen, es mehr als einmal während der Skript-Laufzeit?
  • was "IP" wirst du wählen, wenn das Feld hat mehr IPs drin? Warum?
  • es ist für den Einsatz über ajax, aber es gibt jetzt Grund, warum es nicht zu schnell und optimiert, auch wenn es nur einmal verwendet 😉 @192.168.0.81: funktioniert das obige Skript auf einem webserver wirklich sagen Sie das? somethin ich kann nicht glauben 😛
  • wie gesagt, in en.wikipedia.org/wiki/X-Forwarded-For -> es besteht die Möglichkeit, dass es mehrere IPs im header-Feld, wenn es übergeben wird, über mehrere Proxys/client, der jetzt auch behandelt
  • was ist falsch mit 192.168.0.81-Adresse? Warum denken Sie, es ist unmöglich zu sehen, es in der Skript-Ausgabe? Irgendeinem Grund, die Sie haben?
  • In der Tat, nur LANGSAM ausführen von code zu optimieren. Schnelle ausführen von code ist schnell schon. Warum haben Sie schweigen von ajax-call? was ist der Unterschied zwischen den normalen HTTP-request und AJAX einen aus der server-Sicht?
  • Verstehen Sie, dass all diese coolen HTTP headers hat nichts zu tun mit TCP/IP-Protokoll? Wenn dem so ist, warum nennen Sie es "IP-Adresse", nicht "HTTP-Header"?
  • okay, es gibt die Möglichkeit mehrere IPs weitergeleitet, für den Kopf. welche wirst du wählen und warum?
  • "okay, es gibt die Möglichkeit mehrere IPs weitergeleitet, für den Kopf. welche wirst du wählen und warum?" - ich entschied mich für die erste, da die definition von wikipedia...
  • "was ist Los mit 192.168.0.81-Adresse? Warum denken Sie, es ist unmöglich zu sehen, es in der Skript-Ausgabe? Irgendeinem Grund, die Sie haben? "wie ich sagte >WEB<server(kein lokaler server) und die Definition auf ip-Bereichen en.wikipedia.org/wiki/IP_address#IPv4_subnetting 😛
  • "In der Tat, nur LANGSAM ausführen von code zu optimieren. Schnelle ausführen von code ist schnell schon. Warum haben Sie schweigen von ajax-call? was ist der Unterschied zwischen den normalen HTTP-request und AJAX einen aus der server-Sicht? "- da dieser Teil nennt jeder zweite(auf user-Seite, per AJAX), die es Kosten würde den server viel RAM/CPU mit einer Vielzahl von Benutzern....!?!
  • Ihre wikipedia ist falsch. kein Auftrag ist bestimmt irgendwo noch die form der Adresse oder was auch immer format dieser optionalen header.
  • so what? was ist, wenn mein proxy befindet sich im selben privaten Netz?
  • erleben Sie jedes performance-problem im moment? ist die Bestimmung der Benutzer-IP-Adresse das einzige, was dein script macht? wenn nicht - vielleicht haben Sie zur Optimierung der sinnvolle Teil des Codes, nicht unerheblich ein. warum denken Sie, dass dieser code kostet der server viel RAM/CPU? was Datenbank-lookups mit vielen Nutzern? würde es halt Ihren server, viel schneller als diese paar optionale string-Operationen?

InformationsquelleAutor codex | 2011-03-24
Schreibe einen Kommentar