Maison >développement back-end >tutoriel php >Comprendre comment obtenir l'adresse IP du client en php

Comprendre comment obtenir l'adresse IP du client en php

jacklove
jackloveoriginal
2018-05-22 11:38:422233parcourir

Cet article explique comment obtenir l'IP du client via php

La fonction pour obtenir l'IP est la suivante :

function getIP() {
    $realip = ''; //设置默认值
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $realip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $realip = $_SERVER['REMOTE_ADDR'];
    }
    preg_match('/^((?:\d{1,3}\.){3}\d{1,3})/',$realip,$match);
        if($match && ipType($match[0]) == 'InterNet网地址'){
                return  $match[0];
        }else{
                return  false;
        }
}

//Internet permet l'utilisation d'adresses IP

function ipType($ip) {
    $iplist = explode(".", $ip);
    if ($iplist[0] >= 224 && $iplist[0] <= 239)
                return &#39;多播&#39;;
        if ($iplist[0] >= 240 && $iplist[0] <= 255)
        return &#39;保留&#39;;
    if (preg_match(&#39;/^198\.51\.100/&#39;, $ip))
        return &#39;TEST-NET-2,文档和示例&#39;;
    if (preg_match(&#39;/^203\.0\.113/&#39;, $ip))
        return &#39;TEST-NET-3,文档和示例&#39;;
    if (preg_match(&#39;/^192\.(18|19)\./&#39;, $ip))
        return &#39;网络基准测试&#39;;
    if (preg_match(&#39;/^192\.168/&#39;, $ip))
        return &#39;专用网络[内部网]&#39;;
    if (preg_match(&#39;/^192\.88\.99/&#39;, $ip))
        return &#39;ipv6to4中继&#39;;
    if (preg_match(&#39;/^192\.0\.2\./&#39;, $ip))
        return &#39;TEST-NET-1,文档和示例&#39;;
    if (preg_match(&#39;/^192\.0\.0\./&#39;, $ip))
        return &#39;保留(IANA)&#39;;
    if (preg_match(&#39;/^192\.0\.0\./&#39;, $ip))
        return &#39;保留(IANA)&#39;;
    if ($iplist[0] == 172 && $iplist[1] <= 31 && $iplist[1] >= 16)
        return &#39;专用网络[内部网]&#39;;
    if ($iplist[0] == 169 && $iplist[1] == 254)
        return &#39;链路本地&#39;;
    if ($iplist[0] == 127)
        return &#39;环回地址&#39;;
    if ($iplist[0] == 10)
        return &#39;专用网络[内部网]&#39;;
    if ($iplist[0] == 0)
        return &#39;本网络(仅作为源地址时合法)&#39;;
    return &#39;InterNet网地址&#39;;
}

Les fonctions courantes pour obtenir une IP sur Internet sont les suivantes :

public function get_real_ip() {
    static $realip;
    if (isset($_SERVER)) {
        if (isset($_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;])) {
            $realip = $_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;];
        } else if (isset($_SERVER[&#39;HTTP_CLIENT_IP&#39;])) {
            $realip = $_SERVER[&#39;HTTP_CLIENT_IP&#39;];
        } else {
            $realip = $_SERVER[&#39;REMOTE_ADDR&#39;];
        }
    } else {
        if (getenv(&#39;HTTP_X_FORWARDED_FOR&#39;)) {
            $realip = getenv(&#39;HTTP_X_FORWARDED_FOR&#39;);
        } else if (getenv(&#39;HTTP_CLIENT_IP&#39;)) {
            $realip = getenv(&#39;HTTP_CLIENT_IP&#39;);
        } else {
            $realip = getenv(&#39;REMOTE_ADDR&#39;);
        }
    }
    return $realip;
}

Quelle est la différence entre 'REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP' ?

1.'REMOTE_ADDR' est l'adresse IP distante, la valeur par défaut est celle de la connexion TCP, l'adresse IP du client. On peut dire qu'il est plus précis et certain que seule l'adresse IP du client sera directement connectée au serveur. Si l'autre partie accède à Internet via un serveur proxy, elle sera découverte. Ce qui est obtenu est l'adresse IP du serveur proxy.

Par exemple : a->b(proxy)->c, si c passe 'REMOTE_ADDR', vous ne pouvez obtenir que l'IP de b, mais pas l'IP de a.

2. 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP' afin d'obtenir l'adresse IP de l'utilisateur d'origine ou l'adresse IP du proxy dans un grand réseau. Étendez le protocole HTTP. L'en-tête de l'entité est défini.

HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 Toutes les IP sont séparées par ",". HTTP_CLIENT_IP Dans le proxy anonyme avancé, cela représente l'adresse IP du serveur proxy. Étant donné que le protocole http étend un en-tête d'entité et que cette valeur est approuvée par l'extrémité entrante, il est sûr que l'extrémité entrante la saisit conformément au format de règle. Ce qui suit utilise l'exemple de x_forword_for pour illustrer. Dans des circonstances normales, cette valeur change de processus.

Point de risque :

Ces variables proviennent de la requête http : champ x-forword-for, et champ client-ip. Bien entendu, un serveur proxy normal transmettra ces valeurs conformément aux spécifications RFC. Cependant, lorsqu'un utilisateur construit directement la valeur x-forword-for et l'envoie à l'utilisateur, c'est comme s'il existait un champ qui pouvait écrire n'importe quelle valeur. Et le serveur lit ou écrit directement dans la base de données ou affiche. Cela entraînera un danger, tout comme le résultat général de l’exploitation de la source de données sans aucun filtrage ni test sur l’entrée.

Pour la fonction getip ci-dessus :

Sauf que le client peut falsifier l'IP à volonté et transmettre l'IP dans n'importe quel format. Cela entraînera deux problèmes majeurs. Premièrement, si vous configurez une certaine page et imposez des restrictions IP. L'autre partie peut facilement modifier l'adresse IP et demander continuellement la page. Deuxièmement, si vous utilisez directement ce type de données, cela entraînera des vulnérabilités telles que l'enregistrement SQL et les attaques intersites. Quant au premier, vous pouvez définir des restrictions sur l'entreprise, et il est préférable de ne pas utiliser de restrictions IP. Pour le second, ce type peut entraîner d’énormes risques cyber. Il faut le corriger.

Cet article explique comment obtenir l'adresse IP du client via php. Pour plus de contenu connexe, veuillez faire attention au site Web chinois de php.

Recommandations associées :

Explication détaillée de l'utilisation de Session en php

La différence entre die(), exit() et return in php Introduction

La différence entre la condition on et la condition Where en SQL

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