So erhalten Sie die echte IP-Adresse des Clients in PHP

伊谢尔伦
Freigeben: 2016-11-26 14:14:23
Original
1027 Leute haben es durchsucht

$_SERVER["REMOTE_ADDR"] wird in PHP häufig verwendet, um die Client-IP zu erhalten. Wenn der Client jedoch einen Proxyserver für den Zugriff verwendet, wird die IP-Adresse des Proxyservers erhalten, nicht die tatsächliche IP-Adresse des Clients. Um die echte IP-Adresse des Clients über einen Proxyserver zu erhalten, lesen Sie sie mit $_SERVER["HTTP_X_FORWARDED_FOR"] aus.

Aber nur, wenn der Client einen „transparenten Proxy“ verwendet, ist der Wert von $_SERVER["HTTP_X_FORWARDED_FOR"] die tatsächliche IP des Clients (wenn es sich um einen mehrschichtigen Proxy handelt, kann dieser Wert der sein echte IP des Clients) IP und die IP mehrerer Proxy-Server, getrennt durch Kommas ","), und im Fall von „anonymer Proxy“ und „deceptiver Proxy“ ist es der IP-Wert des Proxy-Servers (falls vorhanden). Bei einem mehrschichtigen Proxy kann dieser Wert aus den IPs mehrerer Proxyserver bestehen, getrennt durch Kommas ","), was im Fall eines „Proxy mit hoher Anonymität“ ein Nullwert ist.

Bezüglich der REMOTE_ADDR- und HTTP_FORWARDED_FOR-Werte in den HTTP-Header-Informationen finden Sie unten eine detaillierte Einführung. Gehen Sie davon aus, dass die tatsächliche IP des Clients 221.5.252.160 ist:

1. PHP-Erfassung ohne Verwendung eines Proxyservers Client-IP-Situation:

REMOTE_ADDR = Client-IP

HTTP_X_FORWARDED_FOR = Kein Wert oder nicht angezeigt

2. Die Situation der Verwendung eines transparenten Proxyservers: Transparente Proxys

REMOTE_ADDR = Letzte Proxy-Server-IP

HTTP_X_FORWARDED_FOR = Echte Client-IP (bei der Weiterleitung über mehrere Proxy-Server ist dieser Wert ähnlich: 221.5.252.160, 203.98.182.163, 203.129.72.215)

Diese Art von Proxyserver sendet immer noch die echte IP des Clients an das Zugriffsobjekt, wodurch der Zweck, die wahre Identität zu verbergen, nicht erreicht werden kann.

3. Verwenden Sie PHP eines gewöhnlichen anonymen Proxyservers, um Client-IP zu erhalten: Anonyme Proxys

REMOTE_ADDR = Letzte Proxyserver-IP

HTTP_X_FORWARDED_FOR = Proxyserver-IP (nach mehreren Bei Verwendung Bei einem Proxyserver ähnelt dieser Wert: 203.98.182.163, 203.98.182.163, 203.129.72.215)

In diesem Fall wird die tatsächliche IP des Clients ausgeblendet, dem Zugriffsobjekt jedoch angezeigt Der Client verwendet einen Proxyserver, um auf sie zuzugreifen.

4. Die Verwendung betrügerischer Proxyserver: Verzerrung von Proxys

REMOTE_ADDR = Proxyserver-IP

HTTP_X_FORWARDED_FOR = zufällige IP (bei der Durchleitung mehrerer Proxyserver ist dieser Wert ähnlich: 220.4.251.159, 203.98.182.163, 203.129.72.215)

In diesem Fall zeigt sich auch, dass der Client einen Proxyserver verwendet, aber eine gefälschte zufällige IP (220.4.251.159) fabriziert, um den Client zu ersetzen echte IP des Clients, um es zu fälschen.

5. Verwendung von PHP mit einem Proxyserver mit hoher Anonymität, um Client-IP zu erhalten: Proxys mit hoher Anonymität (Elite-Proxys)

REMOTE_ADDR = Proxyserver-IP

HTTP_X_FORWARDED_FOR = Kein Wert oder nicht angezeigt

Unabhängig davon, ob es sich um REMOTE_ADDR oder HTTP_FORWARDED_FOR handelt, sind diese Header-Nachrichten möglicherweise nicht verfügbar, da verschiedene Browser und verschiedene Netzwerkgeräte möglicherweise unterschiedliche IP-Header-Nachrichten senden. Daher kann der von PHP mit $_SERVER["REMOTE_ADDR"] und $_SERVER["HTTP_X_FORWARDED_FOR"] erhaltene Wert ein Nullwert oder ein „unbekannter“ Wert sein.

Daher kann der Code zum Abrufen der Client-IP mithilfe von PHP wie folgt lauten:

function getip() {  
    $unknown = 'unknown';  
    if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
        && $_SERVER['HTTP_X_FORWARDED_FOR'] 
        && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) 
    ) {  
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];  
    } elseif ( isset($_SERVER['REMOTE_ADDR']) 
        && $_SERVER['REMOTE_ADDR'] && 
        strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) 
    {  
        $ip = $_SERVER['REMOTE_ADDR'];  
    }  
    /**  
     * 处理多层代理的情况  
     * 或者使用正则方式:$ip = preg_match("/[\d\.]
     * {7,15}/", $ip, $matches) ? $matches[0] : $unknown;  
     */  
    if (false !== strpos($ip, ','))  
        $ip = reset(explode(',', $ip));  
    return $ip;  
}
Nach dem Login kopieren


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage