116 votes

CloudFlare et enregistrement des adresses IP des visiteurs via PHP

J'essaie de suivre et d'enregistrer les utilisateurs/visiteurs qui accèdent à mon site web en utilisant la fonction PHP. $_SERVER['REMOTE_ADDR'] pour le faire. Une méthode typique de suivi des adresses IP en PHP.

Cependant, j'utilise CloudFlare pour la mise en cache et autres et je reçois leurs adresses IP comme celles de CloudFlare :

108.162.212.* - 108.162.239.*

Quelle serait la méthode correcte pour récupérer l'adresse IP réelle des utilisateurs/visiteurs tout en utilisant CloudFlare ?

321voto

sharp12345 Points 1020

Les variables supplémentaires du serveur qui sont disponibles pour cloud flare sont les suivantes :

$_SERVER["HTTP_CF_CONNECTING_IP"] l'adresse ip réelle du visiteur, c'est ce que vous voulez

$_SERVER["HTTP_CF_IPCOUNTRY"] pays du visiteur

$_SERVER["HTTP_CF_RAY"]

$_SERVER["HTTP_CF_VISITOR"] cela peut vous aider à savoir si c'est http ou https

vous pouvez l'utiliser comme ceci :

if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
  $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}

Si vous faites cela, et que la validité de l'adresse IP visiteuse est importante, vous pouvez avoir besoin de vérifier que l'option $_SERVER["REMOTE_ADDR"] contient une véritable adresse IP valide de Cloudflare, car n'importe qui peut falsifier l'en-tête s'il a pu se connecter directement à l'IP du serveur.

19voto

Mise à jour : CloudFlare a publié un module mod_cloudflare pour apache, le module enregistrera et affichera les adresses IP réelles des visiteurs plutôt que celles accédées par cloudflare ! https://www.cloudflare.com/resources-downloads#mod_cloudflare (Réponse par : olimortimer )

Si vous n'avez pas accès au runtime apache, vous pouvez utiliser le script ci-dessous, cela vous permettra de vérifier si la connexion est passée par cloudflare et d'obtenir l'ip des utilisateurs.

Je réécris ma réponse que j'ai utilisée pour une autre question " CloudFlare DNS / identifiant IP direct "

Les ips de Cloudflare sont stockés en public, vous pouvez donc aller les voir. aquí puis vérifiez si l'ip est celle de cloudflare (cela nous permettra d'obtenir l'ip réelle à partir de l'en-tête http). HTTP_CF_CONNECTING_IP ).

Si vous utilisez ceci pour désactiver toutes les connexions non cf ou vice versa, je vous recommande d'avoir un seul fichier php script qui est appelé avant chaque autre script tel que common.php ou pagestart.php etc.

function ip_in_range($ip, $range) {
    if (strpos($range, '/') == false)
        $range .= '/32';

    // $range is in IP/CIDR format eg 127.0.0.1/24
    list($range, $netmask) = explode('/', $range, 2);
    $range_decimal = ip2long($range);
    $ip_decimal = ip2long($ip);
    $wildcard_decimal = pow(2, (32 - $netmask)) - 1;
    $netmask_decimal = ~ $wildcard_decimal;
    return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}

function _cloudflare_CheckIP($ip) {
    $cf_ips = array(
        '199.27.128.0/21',
        '173.245.48.0/20',
        '103.21.244.0/22',
        '103.22.200.0/22',
        '103.31.4.0/22',
        '141.101.64.0/18',
        '108.162.192.0/18',
        '190.93.240.0/20',
        '188.114.96.0/20',
        '197.234.240.0/22',
        '198.41.128.0/17',
        '162.158.0.0/15',
        '104.16.0.0/12',
    );
    $is_cf_ip = false;
    foreach ($cf_ips as $cf_ip) {
        if (ip_in_range($ip, $cf_ip)) {
            $is_cf_ip = true;
            break;
        }
    } return $is_cf_ip;
}

function _cloudflare_Requests_Check() {
    $flag = true;

    if(!isset($_SERVER['HTTP_CF_CONNECTING_IP']))   $flag = false;
    if(!isset($_SERVER['HTTP_CF_IPCOUNTRY']))       $flag = false;
    if(!isset($_SERVER['HTTP_CF_RAY']))             $flag = false;
    if(!isset($_SERVER['HTTP_CF_VISITOR']))         $flag = false;
    return $flag;
}

function isCloudflare() {
    $ipCheck        = _cloudflare_CheckIP($_SERVER['REMOTE_ADDR']);
    $requestCheck   = _cloudflare_Requests_Check();
    return ($ipCheck && $requestCheck);
}

// Use when handling ip's
function getRequestIP() {
    $check = isCloudflare();

    if($check) {
        return $_SERVER['HTTP_CF_CONNECTING_IP'];
    } else {
        return $_SERVER['REMOTE_ADDR'];
    }
}

Pour utiliser le script, c'est assez simple :

$ip = getRequestIP();
$cf = isCloudflare();

if($cf) echo "Connection is through cloudflare: <br>";
else    echo "Connection is not through cloudflare: <br>";

echo "Your actual ip address is: ". $ip;
echo "The server remote address header is: ". $_SERVER['REMOTE_ADDR'];

Ce script vous montrera l'adresse ip réelle et si la requête est CF ou non !

18voto

timmyRS Points 1088

Cloudflare envoie quelques en-têtes de requête supplémentaires à votre serveur, notamment CF-Connecting-IP que nous pouvons stocker dans $user_ip si elle est définie, en utilisant cette simple phrase :

$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);

12voto

olimortimer Points 668

Depuis que cette question a été posée et répondue, CloudFlare a publié mod_cloudflare pour Apache, qui consigne et affiche l'adresse IP réelle du visiteur plutôt que l'adresse CloudFlare :

https://www.cloudflare.com/resources-downloads#mod_cloudflare

3voto

Supun Kavinda Points 62

Il serait difficile de convertir HTTP_CF_CONNECTING_IP en REMOTE_ADDR. Vous pouvez donc utiliser le prépli automatique d'apache (.htaccess) pour le faire. Ainsi, vous n'avez pas besoin de vous demander si le fichier $_SERVER['REMOTE_ADDR'] a la valeur correcte dans tous les scripts de PHP.

Code .htaccess

php_value auto_prepend_file "/path/to/file.php"

code php (file.php)

<?php

define('CLIENT_IP', isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']);

En savoir plus aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X