Ich versuche, Benutzer / Besucher, die auf meine Website zugreifen, mithilfe von PHPs zu verfolgen und zu protokollieren $_SERVER['REMOTE_ADDR']
. Eine typische Methode zur IP-Adressverfolgung in PHP.
Ich verwende CloudFlare jedoch zum Zwischenspeichern und dergleichen und erhalte ihre IP-Adressen als CloudFlare:
108.162.212. * - 108.162.239. *
Was wäre eine korrekte Methode zum Abrufen der tatsächlichen Benutzer- / Besucher-IP-Adresse, während CloudFlare weiterhin verwendet wird?
quelle
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'; // $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 "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!
quelle
Seit diese Frage gestellt und beantwortet wurde, hat CloudFlare
mod_cloudflare
für Apache freigegeben , das die tatsächliche IP-Adresse des Besuchers anstelle der CloudFlare-Adresse protokolliert und anzeigt:https://www.cloudflare.com/resources-downloads#mod_cloudflare
quelle
mod_cloudflare
, aber es kann verwendet werden. Es heißt etwas Neuesmod_remoteip
. Referenz: support.cloudflare.com/hc/en-us/articles/…mod_cloudflare
vor 4 Jahren warCloudflare sendet einige zusätzliche Anforderungsheader an Ihren Server, einschließlich
CF-Connecting-IP
derer, in denen wir$user_ip
, falls definiert, mithilfe dieses einfachen Einzeilers speichern können :$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
quelle
Es wäre schwierig, HTTP_CF_CONNECTING_IP in REMOTE_ADDR zu konvertieren. Sie können dazu Apache (.htaccess) verwenden, das automatisch vorangestellt wird. Damit Sie nicht darüber nachdenken müssen, ob der
$_SERVER['REMOTE_ADDR']
in allen PHP-Skripten 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 hier mehr
quelle
HTTP_CF_CONNECTING_IP funktioniert nur, wenn Sie Cloudflare verwenden. Vielleicht übertragen Sie Ihre Site oder entfernen Cloudflare. Sie werden den Wert vergessen. Verwenden Sie diesen Code.
$ip=$_SERVER["HTTP_CF_CONNECTING_IP"]; if (!isset($ip)) { $ip = $_SERVER['REMOTE_ADDR']; }
quelle
Informationen zu Magento 1.x-Benutzern (ich habe Magento 2.0 noch nicht ausprobiert) finden Sie unter https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the- rechts / die app / etc / local.xml ändern und hinzufügen muss: HTTP_CF_CONNECTING_IP
quelle
Wenn Sie CloudFlare verwenden, werden alle Ihre Anforderungen zwischen Ihrem Server und den Benutzern über CloudFlare-Server weitergeleitet.
In diesem Fall gibt es zwei Methoden, um die tatsächliche IP-Adresse des Benutzers abzurufen:
Methode 1: IP über zusätzliche Server-Header abrufen
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']);
Wie funktioniert es?
CloudFlare fügt der Anforderung einige zusätzliche Servervariablen wie folgt hinzu:
$_SERVER["HTTP_CF_CONNECTING_IP"]
- Echte IP-Adresse des Benutzers$_SERVER["HTTP_CF_IPCOUNTRY"]
- ISO2-Land des Benutzers$_SERVER["HTTP_CF_RAY"]
Eine spezielle Zeichenfolge für ProtokollierungszweckeIm obigen Code prüfen wir, ob
$_SERVER["HTTP_CF_CONNECTING_IP"]
eingestellt ist oder nicht. Wenn es dort ist, werden wir berücksichtigen, dass wir als IP-Adresse des Benutzers den Standardcode als verwenden$_SERVER['REMOTE_ADDR']
Methode 2: Installieren des Cloudflare-Moduls auf Ihrem Server
quelle