CloudFlare y registro de direcciones IP de visitantes a través de PHP


Estoy tratando de rastrear y registrar a los usuarios/visitantes que están accediendo a mi sitio web utilizando PHP $_SERVER['REMOTE_ADDR'] para hacerlo. Un método típico para el seguimiento de direcciones IP en PHP.

Sin embargo, estoy usando CloudFlare para el almacenamiento en caché y tal y recibir sus direcciones IP como de CloudFlare:

108.162.212.* - 108.162.239.*

¿Cuál sería un método correcto para recuperar la dirección IP real de los usuarios/visitantes mientras se sigue utilizando CloudFlare?

Author: Marcus Adams, 2013-02-20

8 answers

Las variables de servidor adicionales que están disponibles para cloud flare son:

$_SERVER["HTTP_CF_CONNECTING_IP"] dirección ip real del visitante, esto es lo que quieres

$_SERVER["HTTP_CF_IPCOUNTRY"] país del visitante

$_SERVER["HTTP_CF_RAY"] ver descripción aquí

$_SERVER["HTTP_CF_VISITOR"] esto puede ayudarle a saber si su http o https

Puedes usarlo así:

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

Si hace esto, y la validez de la dirección IP de visita es importante, es posible que deba verificar que $_SERVER["REMOTE_ADDR"] contiene una dirección IP válida real de cloudflare, porque cualquiera puede falsificar el encabezado si fue capaz de conectarse directamente a la IP del servidor.

 189
Author: sharp12345,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-22 00:15:01

Desde que se hizo y respondió a esta pregunta, CloudFlare ha lanzado mod_cloudflare para Apache, que registra y muestra la dirección IP real del visitante en lugar de la dirección de CloudFlare:

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

 10
Author: olimortimer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-06 13:54:03

Cloudflare envía algunas cabeceras de solicitud adicionales a su servidor, incluyendo CF-Connecting-IP que podemos almacenar en $user_ip, si está definido, usando este simple one-liner:

$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
 7
Author: timmyRS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-10 11:02:26

Estoy reescribiendo mi respuesta que usé para otra pregunta " CloudFlare DNS / direct IP identifier "

Las ip de Cloudflare se almacenan en público para que pueda verlas aquí luego verifique si la ip es de cloudflare (esto nos permitirá obtener la ip real del encabezado http HTTP_CF_CONNECTING_IP).

Si está usando esto para deshabilitar todas las conexiones no cf o viceversa, le recomiendo que tenga un solo archivo de script php que se llame antes que cualquier otro script, como un común.php o 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'];
    }
}

Para usar el script es bastante simple:

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

if($cf) echo "Cloudflare :D<br>";
else    echo "Not cloudflare o_0";

echo "Your actual ip address is: ". $ip;

Este script le mostrará la dirección ip real y si la solicitud es CF o no!

 6
Author: Callum Carmicheal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:43

Sería difícil convertir HTTP_CF_CONNECTING_IP a REMOTE_ADDR. Así que puedes usar apache (.htaccess) auto anteponiendo a hacer eso. Así que no necesita pensar si $_SERVER['REMOTE_ADDR'] tiene el valor correcto en todos los scripts PHP.

.código htaccess

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

Código Php (archivo.php)

<?php

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

Más información aquí

 2
Author: Supun Kavinda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-17 13:45:47

Para magento 1.x usuarios (todavía no he probado magento 2.0), compruebe https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the-right-way / que necesita cambiar app/etc/local.xml y añadir: HTTP_CF_CONNECTING_IP

 0
Author: xinqiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-31 03:44:38

HTTP_CF_CONNECTING_IP solo funciona si está utilizando cloudflare tal vez transfiera su sitio o elimine cloudflare olvidará el valor, así que use este código .

$ip=$_SERVER["HTTP_CF_CONNECTING_IP"];
if (!isset($ip)) {
  $ip = $_SERVER['REMOTE_ADDR'];
}
 0
Author: RootTools,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 13:36:54

Cuando utiliza CloudFlare, todas sus solicitudes entre el servidor y los usuarios se enrutan a través de servidores CloudFlare.

En este caso hay dos métodos para obtener la Dirección IP Real del Usuario:

  1. A través de Encabezados de Servidor adicionales agregados por Servidores CloudFlare
  2. Añadiendo un módulo CloudFlare Apache/NGINX en su servidor.

Método 1: Obtener IP a través de encabezados de servidor adicionales

Puede usar el siguiente código para obtener la IP del usuario Dirección:

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

¿Cómo funciona?

CloudFlare agrega algunas variables de servidor adicionales en la solicitud de la siguiente manera:

$_SERVER["HTTP_CF_CONNECTING_IP"] - Dirección IP real del usuario

$_SERVER["HTTP_CF_IPCOUNTRY"] - ISO2 País del Usuario

$_SERVER["HTTP_CF_RAY"] Una cadena especial para loggin purpose

En el código anterior, estamos comprobando si $_SERVER["HTTP_CF_CONNECTING_IP"] está configurado o no. Si está allí, consideraremos que como dirección IP del usuario, de lo contrario, usaremos el código predeterminado como $_SERVER['REMOTE_ADDR']

Método 2: Instalación de Cloudflare Módulo en su servidor

 0
Author: Ashutosh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-12 23:22:06