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:
- A través de Cabeceras de servidor adicionales agregadas por Servidores CloudFlare
- 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
Desde que se hizo y se respondió esta pregunta, CloudFlare ha lanzado mod_cloudflare
para Apache, que registra y muestra la dirección IP del visitante real en lugar de la dirección de CloudFlare:
https://www.cloudflare.com/resources-downloads#mod_cloudflare
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.
Para usuarios de magento 1.x (aún 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 la aplicación / etc / local.xml y agregar: HTTP_CF_CONNECTING_IP
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