Heim > Artikel > Backend-Entwicklung > PHP-Lösung, um die echte IP des Benutzer-Clients zu erhalten
Das Abrufen der Client-IP ist eigentlich keine einfache Aufgabe. Aufgrund von IP-Spoofing und Proxy-Problemen ist die Authentizität des Client-IP-Abrufs nicht zu 100 % gewährleistet. Wir versuchen jedoch dennoch, eine vollständigere Lösung zu finden. Es gibt viele Möglichkeiten, die echte IP des Clients zu erhalten.
function getIp(){ if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return($ip);
Jetzt müssen wir diesen Code erklären: getenv( ) und strcasecmp() , die vorherige Funktion ruft die Systemumgebungsvariable ab, sie gibt den Wert zurück, andernfalls gibt sie false zurück.
$_SERVER ist das superglobale Variablenarray des Servers, verwenden Sie $ _SERVER['REMOTE_ADDR'] auf die gleiche Weise Sie können die IP-Adresse des Clients abrufen. Der Unterschied zwischen den beiden besteht darin, dass getenv die Ausführung von PHP im IIS-Isapi-Modus nicht unterstützt. Die Verwendung der String-Funktion besteht darin, string1 und string2 zu vergleichen. Wenn string1 größer als 0 ist, wird eine Zahl kleiner als 0 zurückgegeben 🎜>
Funktion verwendet zuerst die Kunden-IP. Wenn sie nicht eingerichtet ist, verwenden Sie die Proxy-Methode. Wenn sie nicht funktioniert, verwenden Sie REMOTE_ADDR.Ich habe auch eine detailliertere Methode zur Erkennung gesehen IP, die IP-Spoofing und mehrere Proxy-Codes berücksichtigt.1. Es wird kein Proxyserver verwendet. PHP erhält die Client-IP:
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; }REMOTE_ADDR = Client-IP
HTTP_X_FORWARDED_FOR = Kein Wert oder wird nicht angezeigt
2. Die Verwendung transparenter Proxyserver: Transparente Proxys
HTTP_X_FORWARDED_FOR = Echte IP des Clients (wenn Beim Durchlaufen mehrerer Proxyserver ist dieser Wert ähnlich: 221.5.252.160, 203.98.182.163, 203.129.72.215)
Diese Art von Proxy Der Server sendet immer noch die echte IP des Clients an das Zugriffsobjekt, das das nicht erreichen kann Zweck, die wahre Identität zu verbergen.
HTTP_X_FORWARDED_FOR = Proxyserver-IP (Beim Durchlaufen mehrerer Proxy-Server ist dieser Wert ähnlich: 203.98.182.163, 203.98.182.163, 203.129.72.215)
In diesem Fall wird die tatsächliche IP des Clients ausgeblendet, sie ist jedoch nicht verfügbar Dem Zugriffsobjekt wird offenbart, dass der Client einen Proxyserver verwendet, um darauf zuzugreifen.
HTTP_X_FORWARDED_FOR = Zufällige IP (beim Durchlaufen mehrerer Proxyserver ist dieser Wert ähnlich: 220.4.251.159, 203.98.182.163, 203.129.72.215)
In diesem Fall zeigt sich das Gleiche. Der Client verwendet einen Proxyserver, fabriziert jedoch einen gefälschte zufällige IP (220.4.251.159) anstelle der echten IP des Clients, um ihn zu täuschen