Maison  >  Article  >  développement back-end  >  Utilisez PHP pour obtenir l'adresse IP du client et du serveur

Utilisez PHP pour obtenir l'adresse IP du client et du serveur

王林
王林avant
2019-08-19 16:01:145619parcourir

1. PHP obtient l'IP du client

Lorsque PHP obtient l'IP du client, $_SERVER["REMOTE_ADDR"] est souvent utilisé. Mais si le client utilise un serveur proxy pour accéder, ce qui est obtenu est l'adresse IP du serveur proxy, et non la véritable adresse IP du client. Pour obtenir la véritable adresse IP du client via le serveur proxy, utilisez $_SERVER["HTTP_X_FORWARDED_FOR"] pour la lire.

Mais seulement lorsque le client utilise un "proxy transparent", la valeur de $_SERVER["HTTP_X_FORWARDED_FOR"] est la véritable IP du client (s'il s'agit d'un proxy multicouche, cette valeur peut être la réelle du client) IP et l'IP de plusieurs serveurs proxy, séparés par des virgules "," ); dans le cas de "proxy anonyme" et "proxy trompeur", il s'agit de la valeur IP du serveur proxy (si elle est pour un proxy multicouche, cette valeur peut être composée de plusieurs IP de serveur proxy, séparées par des virgules ","); dans le cas d'un "proxy à anonymat élevé", c'est une valeur vide.

REMOTE_ADDR est l'adresse IP lorsque votre client "poigne la main" avec votre serveur. Si un "proxy anonyme" est utilisé, REMOTE_ADDR affichera l'IP du serveur proxy.
HTTP_CLIENT_IP est l'en-tête HTTP envoyé par le serveur proxy. S'il s'agit d'un "proxy super anonyme", la valeur "none" est renvoyée. De même, REMOTE_ADDR sera remplacé par l'IP de ce serveur proxy.

$_SERVER['REMOTE_ADDR']; //IP de l'accesseur (peut être un utilisateur, un serveur proxy ou un serveur proxy inverse)
$_SERVER['HTTP_CLIENT_IP' ] //Côté agent (peut exister, peut être falsifié), pas encore un standard, pas forcément implémenté par tous les serveurs.
$_SERVER['HTTP_X_FORWARDED_FOR']; //Quelle adresse IP est le proxy que l'utilisateur doit utiliser (elle peut exister ou peut être falsifiée). Il existe une définition standard utilisée pour identifier l'adresse IP du client après le proxy HTTP. Le format est : clientip, proxy1, proxy2. Pour une explication détaillée, voir http://zh.wikipedia.org/wiki/X-Forwarded-For.

La différence entre les trois valeurs est la suivante :

1. Lorsqu'aucun serveur proxy n'est utilisé :

REMOTE_ADDR = Votre IP
HTTP_VIA = Aucune valeur ou non affichée
HTTP_X_FORWARDED_FOR = Aucune valeur ou non affichée

2. Lors de l'utilisation de serveurs proxy transparents : Proxies transparents

REMOTE_ADDR = Dernier IP du serveur proxy
HTTP_VIA = IP du serveur proxy
HTTP_X_FORWARDED_FOR = Votre véritable IP Lorsque vous passez par plusieurs serveurs proxy, cette valeur est similaire à la suivante : 203.98.182.163, 203.98.182.163, 203.129.72.215.

Ce type de serveur proxy transmet toujours vos informations à la personne que vous visitez et ne peut pas atteindre l'objectif de cacher votre véritable identité.

3. Lors de l'utilisation de serveurs proxy anonymes ordinaires : Proxies anonymes

REMOTE_ADDR = Dernière IP du serveur proxy
HTTP_VIA = IP du serveur proxy
HTTP_X_FORWARDED_FOR = Serveur proxy IP, lors du passage via plusieurs serveurs proxy, cette valeur est similaire à la suivante : 203.98.182.163, 203.98.182.163, 203.129.72.215.

Cachez votre véritable IP, mais révélez à vos visiteurs que vous utilisez un serveur proxy pour y accéder.

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

REMOTE_ADDR = IP du serveur proxy
HTTP_VIA = IP du serveur proxy
HTTP_X_FORWARDED_FOR = IP aléatoire, lors du passage via plusieurs serveurs proxy, cette valeur est similaire à la suivante : 203.98.182.163, 203.98.182.163, 203.129.72.215.

Dites au visiteur que vous utilisez un serveur proxy, mais inventez une fausse adresse IP aléatoire au lieu de votre véritable adresse IP pour le tromper.

5. Lors de l'utilisation de serveurs proxy à haut anonymat : proxys à haut anonymat (proxys Elite)

REMOTE_ADDR = IP du serveur proxy
HTTP_VIA = Aucune valeur ou non affiché
HTTP_X_FORWARDED_FOR = Aucune valeur ou non affiché. Lors du passage via plusieurs serveurs proxy, la valeur est similaire à la suivante : 203.98.182.163, 203.98.182.163, 203.129.72.215.

Remplace complètement toutes vos informations par celles du serveur proxy, tout comme vous utilisez ce serveur proxy pour accéder directement à l'objet.

Exemple de code :

//获取用户IP, 定义一个函数getIP()
function getClientIP(){
if (getenv("HTTP_CLIENT_IP")) {
	$ip = getenv("HTTP_CLIENT_IP");
}elseif(getenv("HTTP_X_FORWARDED_FOR")) {
	$ip = getenv("HTTP_X_FORWARDED_FOR");
}elseif(getenv("REMOTE_ADDR")) {
$ip = getenv("REMOTE_ADDR");
	else $ip = "Unknow";
}
return $ip;
}
或者
function getClientIp() {
	$ip = 'unknow';
    foreach (array(
                'HTTP_CLIENT_IP',
                'HTTP_X_FORWARDED_FOR',
                'HTTP_X_FORWARDED',
                'HTTP_X_CLUSTER_CLIENT_IP',
                'HTTP_FORWARDED_FOR',
                'HTTP_FORWARDED',
                'REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                //会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤
                //也可以修改成正则验证IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
    }
    return $ip;
}

2.php Obtenez l'IP côté serveur

Variables liées à l'IP côté serveur
a $_SERVER[. " SERVER_NAME"], vous devez utiliser la fonction gethostbyname() pour l'obtenir. Cette variable s'affiche correctement côté serveur et côté client.

b. $_SERVER["SERVER_ADDR"], testé côté serveur : 127.0.0.1 (ceci est lié à la valeur de paramètre de BindAddress dans httpd.conf). Les résultats des tests sur le client sont corrects.

/**
* 获取服务器端IP地址
 * @return string
 */
function getServerIp() { 
    if (isset($_SERVER)) { 
        if($_SERVER['SERVER_ADDR']) {
            $server_ip = $_SERVER['SERVER_ADDR']; 
        } else { 
            $server_ip = $_SERVER['LOCAL_ADDR']; 
        } 
    } else { 
        $server_ip = getenv('SERVER_ADDR');
    } 
    return $server_ip; 
}
或者
function getServerIP(){    
    return gethostbyname($_SERVER["SERVER_NAME"]);    
}

Pour plus de questions connexes, veuillez visiter le didacticiel de questions liées au site Web PHP chinois : https://www.php.cn/

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer