it-swarm.com.de

CloudFlare und Protokollierung der IP-Adressen von Besuchern über in PHP

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?

69
tfont

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.

204
sharp12345

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

10
olimortimer

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']);
8
timmyRS

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!

7

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

2
Supun Kavinda

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'];
}
1
RootTools

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

0
xinqiu

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:

  1. Über zusätzliche Serverheader, die von CloudFlare-Servern hinzugefügt wurden
  2. Hinzufügen eines CloudFlare Apache/NGINX-Moduls auf Ihrem Server.

Methode 1: IP durch zusätzliche Serverheader 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 es funktioniert

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.

Methode 2: Installieren des Cloudflare-Moduls auf Ihrem Server

0
Ashutosh Kumar