Ich versuche, Benutzer/Besucher, die auf meine Website zugreifen, mithilfe von $_SERVER['REMOTE_ADDR']
von PHP zu protokollieren und zu protokollieren. Eine typische Methode zur IP-Adressverfolgung in PHP.
Ich verwende jedoch CloudFlare für das Caching und dergleichen und empfange ihre IP-Adressen als CloudFlare:
108.162.212. * - 108.162.239. *
Was wäre eine korrekte Methode zum Abrufen der tatsächlichen IP-Adresse der Benutzer/Besucher, während CloudFlare noch verwendet wird?
Zusätzliche Servervariablen, die für Cloud-Flare verfügbar sind, sind:
$_SERVER["HTTP_CF_CONNECTING_IP"]
Echte IP-Adresse des Besuchers, genau das wollen Sie
$_SERVER["HTTP_CF_IPCOUNTRY"]
land des besuchers
$_SERVER["HTTP_CF_RAY"]
siehe Beschreibung hier
$_SERVER["HTTP_CF_VISITOR"]
Dies kann Ihnen helfen zu wissen, ob es sich um http oder https handelt
sie können es so verwenden:
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
Wenn Sie dies tun und die Gültigkeit der IP-Adresse des Besuchs wichtig ist, müssen Sie möglicherweise überprüfen, dass der $_SERVER["REMOTE_ADDR"]
eine tatsächliche gültige Cloudflare-IP-Adresse enthält, da jeder den Header fälschen kann, wenn er sich direkt mit der Server-IP verbinden konnte.
Da diese Frage gestellt und beantwortet wurde, hat CloudFlare mod_cloudflare
für Apache veröffentlicht, der die tatsächliche IP-Adresse des Besuchers anstelle der CloudFlare-Adresse protokolliert und anzeigt:
https://www.cloudflare.com/resources-downloads#mod_cloudflare
Cloudflare sendet einige zusätzliche Anforderungsheader an Ihren Server, einschließlich CF-Connecting-IP
, die wir, sofern definiert, in $user_ip
speichern können, indem Sie diesen einfachen Einzeiler verwenden:
$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
Ich schreibe meine Antwort, die ich für eine andere Frage verwendet habe, " CloudFlare DNS/direkte IP-Kennung ".
Cloudflare-IPS werden in der Öffentlichkeit gespeichert. Sie können sie also here anzeigen und dann überprüfen, ob die IP-Adresse von Cloudflare stammt (dies ermöglicht uns, die echte IP-Adresse aus dem http-Header HTTP_CF_CONNECTING_IP
zu erhalten).
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. einer common.php oder pagestart.php usw.
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'];
}
}
Um das Skript zu verwenden, ist es ganz einfach:
$ip = getRequestIP();
$cf = isCloudflare();
if($cf) echo "Cloudflare :D<br>";
else echo "Not cloudflare o_0";
echo "Your actual ip address is: ". $ip;
Dieses Skript zeigt Ihnen die tatsächliche IP-Adresse und ob die Anfrage CF ist oder nicht!
Es wäre schwierig, HTTP_CF_CONNECTING_IP nach REMOTE_ADDR zu konvertieren. Sie können also Apache (.htaccess) verwenden, um dies automatisch durchzuführen. Damit Sie nicht darüber nachdenken müssen, ob der $_SERVER['REMOTE_ADDR']
in allen PHP - Skripts den richtigen Wert hat.
.htaccess code
php_value auto_prepend_file "/path/to/file.php"
php code (file.php)
<?php
define('CLIENT_IP', isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']);
Erfahren Sie mehr hier
HTTP_CF_CONNECTING_IP funktioniert nur, wenn Sie Cloudflare verwenden. Möglicherweise übertragen Sie Ihre Site oder entfernen Cloudflare. Sie werden den Wert vergessen.
$ip=$_SERVER["HTTP_CF_CONNECTING_IP"];
if (!isset($ip)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
Für Benutzer von magento 1.x (ich habe Magento 2.0 noch nicht ausprobiert), check https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare- der rechte Weg/ , der App/etc/local.xml ändern und Folgendes hinzufügen muss: HTTP_CF_CONNECTING_IP
Wenn Sie CloudFlare verwenden, werden alle Ihre Anforderungen zwischen Ihrem Server und Benutzern über CloudFlare-Server weitergeleitet.
In diesem Fall gibt es zwei Methoden, um die reale IP-Adresse des Benutzers abzurufen:
Sie können den folgenden Code verwenden, um die IP-Adresse des Benutzers abzurufen:
$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"]) $_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
CloudFlare fügt der Anforderung einige zusätzliche Servervariablen wie folgt hinzu:
$_SERVER["HTTP_CF_CONNECTING_IP"]
- Reale IP-Adresse des Benutzers
$_SERVER["HTTP_CF_IPCOUNTRY"]
- ISO2-Land des Benutzers
$_SERVER["HTTP_CF_RAY"]
Eine spezielle Zeichenfolge für Anmeldezwecke
Im obigen Code prüfen wir, ob $_SERVER["HTTP_CF_CONNECTING_IP"]
Gesetzt ist oder nicht. Wenn es dort ist, werden wir berücksichtigen, dass wir als IP-Adresse des Benutzers sonst den Standardcode als $_SERVER['REMOTE_ADDR']
Verwenden.