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 !