Maison >développement back-end >tutoriel php >Solution PHP pour obtenir la véritable IP du client utilisateur

Solution PHP pour obtenir la véritable IP du client utilisateur

墨辰丷
墨辰丷original
2018-06-01 10:13:031956parcourir

L'obtention de l'adresse IP du client n'est en fait pas une tâche simple. En raison de problèmes d'usurpation d'adresse IP et de proxy, l'authenticité de l'obtention de l'adresse IP du client sera compromise et ne pourra pas être précise à 100 %. Mais nous essayons d'utiliser des méthodes plus complètes pour obtenir l'adresse IP du client. IP. Laissez-moi partager avec vous comment obtenir la véritable adresse IP du client de l'utilisateur en PHP. Jetons un coup d'œil

Obtenir l'adresse IP du client n'est en fait pas une tâche simple car il y a des problèmes d'usurpation d'adresse IP et de proxy. donc l'authenticité de l'obtention de l'adresse IP du client sera compromise et ne pourra pas être précise à 100 %. Mais nous essayons toujours de trouver une méthode plus complète pour obtenir la véritable adresse IP du client. Il existe de nombreuses façons d'obtenir l'adresse IP en utilisant php.

<.>

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[&#39;REMOTE_ADDR&#39;]) && $_SERVER[&#39;REMOTE_ADDR&#39;] && strcasecmp($_SERVER[&#39;REMOTE_ADDR&#39;], "unknown"))
$ip = $_SERVER[&#39;REMOTE_ADDR&#39;];
else
$ip = "unknown";
return($ip);

Nous devons maintenant expliquer ce code. Deux fonctions sont utilisées ici, getenv() et strcasecmp(). la valeur peut être obtenue, la valeur sera renvoyée, sinon false sera renvoyé.

$_SERVER est le tableau de variables super globales du serveur, et $_SERVER['REMOTE_ADDR'] peut également être utilisé pour obtenir celui du client. Adresse IP. Les deux La différence est que getenv ne prend pas en charge PHP exécuté en mode isapi IIS

strcasecmp(string1, string2) L'utilisation de la fonction string est de comparer string1 et string2 s'ils sont égaux. sera renvoyé. Si string1 est supérieur à string2, renvoie un nombre supérieur à 0, s'il est inférieur à 0, renvoie un nombre inférieur à 0.

La fonction utilise d'abord l'adresse IP du client. Si cela ne fonctionne pas, essayez d'utiliser la méthode proxy. Si cela ne fonctionne pas, utilisez REMOTE_ADDR.

Voir également Une méthode plus détaillée de détection d'adresse IP, prenant en compte l'usurpation d'adresse IP et plusieurs codes proxy

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

1. PHP sans serveur proxy pour obtenir l'IP client :

REMOTE_ADDR = Client IP

HTTP_X_FORWARDED_FOR = Aucune valeur ou non affiché


2. Utiliser la situation du serveur proxy transparent : Proxies transparents

REMOTE_ADDR = Dernière IP du serveur proxy

HTTP_X_FORWARDED_FOR = IP réelle du client (lorsque en passant par plusieurs serveurs proxy, cette valeur est similaire : 221.5.252.160, 203.98.182.163 , 203.129.72.215)


Ce type de serveur proxy envoie toujours la véritable adresse IP du client à l'objet d'accès, ce qui ne peut pas atteindre l'objectif de cacher la véritable identité.

3. Utiliser l'anonymat ordinaire Le PHP du serveur proxy obtient l'IP du client : Proxies anonymes

REMOTE_ADDR = Dernière IP du serveur proxy

HTTP_X_FORWARDED_FOR = IP du serveur proxy (lors du passage par plusieurs serveurs proxy, cette valeur est similaire : 203.98.182.163, 203.98.182.163, 203.129.72.215)



Dans ce cas, la véritable IP du client est masquée , mais il est révélé à l'objet d'accès que le client utilise un serveur proxy pour y accéder.

4. L'utilisation de serveurs proxy trompeurs : distorsion des proxys

REMOTE_ADDR. = IP du serveur proxy

HTTP_X_FORWARDED_FOR = IP aléatoire (lors du passage par plusieurs serveurs proxy, cette valeur est similaire : 220.4.251.159, 203.98.182.163, 203.129.72.215)


Dans ce cas, il est également révélé que le client utilise un serveur proxy, mais fabrique une fausse adresse IP aléatoire (220.4.251.159) pour remplacer la véritable adresse IP du client afin de le tromper.

5. Utilisez PHP d'un serveur proxy à haut anonymat pour obtenir le client. IP : Proxies à haut anonymat (Proxies Elite)

REMOTE_ADDR = IP du serveur proxy

HTTP_X_FORWARDED_FOR = Aucune valeur ou non affiché

Qu'il s'agisse de REMOTE_ADDR ou de HTTP_FORWARDED_FOR, ces les messages d'en-tête peuvent ne pas être disponibles car différents navigateurs et différents périphériques réseau peuvent envoyer différents messages d'en-tête IP. PHP utilise donc $_SERVER["REMOTE_ADDR"] et $_SERVER["HTTP_X_FORWARDED_FOR"] pour obtenir une valeur qui peut être une valeur nulle ou une valeur nulle. valeur "inconnue".

Résumé : ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il pourra être utile à l'étude de chacun.

Recommandations associées :

phpCas d'implémentation de l'interface d'inscription et de connexion

php La différence entre array_key_exists() et isset()

phpPratique de création d'une salle de discussion basée sur websocket

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn