support signup php logging ip-address cloudflare

php - support - cloudflare signup



CloudFlare y registro de las direcciones IP de los visitantes a través de PHP (8)

Estoy intentando rastrear y registrar usuarios / visitantes que están accediendo a mi sitio web usando $_SERVER[''REMOTE_ADDR''] 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 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 usa CloudFlare?


Cloudflare envía algunos encabezados de solicitud adicionales a su servidor, incluido CF-Connecting-IP que podemos almacenar en $user_ip , si está definido, usando este sencillo $user_ip :

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


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

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

  1. A través de Cabeceras de servidor adicionales agregadas por Servidores CloudFlare
  2. Agregar un módulo CloudFlare Apache / NGINX en su servidor.

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

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

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

¿Cómo está funcionando?

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 el propósito de $_SERVER["HTTP_CF_RAY"]

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

Método 2: Instalar Cloudflare Module en su servidor



Estoy reescribiendo mi respuesta que utilicé para otra pregunta " CloudFlare DNS / identificador directo de IP "

Los ips de Cloudflare se almacenan en público, así que puedes ir a verlos here luego verificar si la ip proviene de cloudflare (esto nos permitirá obtener la ip real del encabezado HTTP HTTP_CF_CONNECTING_IP ).

Si está utilizando esto para deshabilitar todas las conexiones que no sean cf o viceversa, le recomiendo tener un único archivo de script php que se llame antes que cualquier otro script, como common.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;

¡Esta secuencia de comandos le mostrará la dirección IP real y si la solicitud es CF o no!


HTTP_CF_CONNECTING_IP solo funciona si usa 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'']; }


Las variables adicionales del servidor que están disponibles para el brillo de la nube son:

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

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

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

$_SERVER["HTTP_CF_VISITOR"] esto puede ayudarlo 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 visitante es importante, es posible que deba verificar que $_SERVER["REMOTE_ADDR"] contenga una dirección IP de nube nubosa válida, ya que cualquiera puede falsificar el encabezado si pudo conectarse. directamente a la IP del servidor.



Sería difícil convertir HTTP_CF_CONNECTING_IP en REMOTE_ADDR. De modo que puede usar apache (.htaccess) autoprepending para hacer eso. Para que no tenga que pensar si $_SERVER[''REMOTE_ADDR''] tiene el valor correcto en todos los scripts de PHP.

.htaccess code

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

código php (file.php)

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

Aprende más here