Update : CloudFlare hat ein Modul mod_cloudflare
für Apache veröffentlicht. Das Modul protokolliert und zeigt die tatsächlichen Besucher-IP-Adressen an und nicht die, auf die Cloudflare zugreift! https://www.cloudflare.com/resources-downloads#mod_cloudflare (Antwort von: olimortimer )
Wenn Sie keinen Zugriff auf die Apache-Laufzeit haben, können Sie das folgende Skript verwenden. Auf diese Weise können Sie überprüfen, ob die Verbindung über Cloudflare hergestellt wurde, und die IP-Adresse des Benutzers abrufen.
Ich schreibe meine Antwort um, die ich für eine andere Frage verwendet habe: " CloudFlare DNS / Direct IP Identifier ".
Die IPs von Cloudflare werden öffentlich gespeichert, sodass Sie sie hier anzeigen und dann überprüfen können, ob die IP von Cloudflare stammt (dies ermöglicht es uns, die echte IP aus dem http-Header abzurufen HTTP_CF_CONNECTING_IP
).
Wenn Sie dies verwenden, um alle Nicht-CF-Verbindungen zu deaktivieren oder umgekehrt, empfehle ich Ihnen, eine einzige PHP-Skriptdatei zu haben, die vor jedem anderen Skript aufgerufen wird, z. B. eine common.php oder eine pagestart.php usw.
function ip_in_range($ip, $range) {
if (strpos($range, '/') == false)
$range .= '/32';
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);
}
function getRequestIP() {
$check = isCloudflare();
if($check) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
Um das Skript zu verwenden, ist es ganz einfach:
$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'];
Dieses Skript zeigt Ihnen die echte IP-Adresse und ob die Anfrage CF ist oder nicht!