CloudFlare i rejestrowanie adresów IP odwiedzających przez w PHP

Próbuję śledzić i rejestrować użytkowników / odwiedzających, którzy uzyskują dostęp do mojej strony za pomocą PHP $_SERVER['REMOTE_ADDR'], aby to zrobić. Typowa metoda śledzenia adresów IP w PHP.

Jednak używam CloudFlare do buforowania i takich i odbierania ich adresów IP jako CloudFlare:

108.162.212.* - 108.162.239.*

Jaka byłaby prawidłowa metoda pobierania rzeczywistego adresu IP użytkowników / odwiedzających podczas korzystania z CloudFlare?

Author: Marcus Adams, 2013-02-20

8 answers

Dodatkowe zmienne serwera, które są dostępne dla Cloud flare to:

$_SERVER["HTTP_CF_CONNECTING_IP"] prawdziwy adres IP odwiedzającego, to jest to, czego chcesz

$_SERVER["HTTP_CF_IPCOUNTRY"] Kraj odwiedzającego

$_SERVER["HTTP_CF_RAY"] zobacz opis tutaj

$_SERVER["HTTP_CF_VISITOR"] może to pomóc ci dowiedzieć się, czy jego http lub https

Możesz go użyć Tak:

if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
  $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}

Jeśli to zrobisz, a Ważność odwiedzającego adresu IP jest ważna, być może będziesz musiał sprawdzić, czy $_SERVER["REMOTE_ADDR"] zawiera rzeczywisty prawidłowy adres IP cloudflare, ponieważ każdy może sfałszować nagłówek, jeśli był w stanie połączyć się bezpośrednio z IP serwera.

 189
Author: sharp12345,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-22 00:15:01

Ponieważ to pytanie zostało zadane i odpowiedzi, CloudFlare wydała mod_cloudflare dla Apache, który loguje i wyświetla rzeczywisty adres IP odwiedzającego, a nie Adres CloudFlare:

Https://www.cloudflare.com/resources-downloads#mod_cloudflare

 10
Author: olimortimer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 13:54:03

Cloudflare wysyła dodatkowe nagłówki żądań do twojego serwera, w tym CF-Connecting-IP, które możemy zapisać w $user_ip, jeśli są zdefiniowane, używając tego prostego jednolinijkowego:

$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
 7
Author: timmyRS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 11:02:26

Przepisuję odpowiedź, której użyłem na inne pytanie "CloudFlare DNS / direct IP identifier "

Adresy IP Cloudflare są przechowywane publicznie, więc możesz je przejrzeć tutaj , a następnie sprawdzić, czy adres IP pochodzi z cloudflare (pozwoli nam to uzyskać prawdziwy adres ip z nagłówka http HTTP_CF_CONNECTING_IP).

Jeśli używasz tego do wyłączania wszystkich połączeń innych niż cf lub odwrotnie, zalecam posiadanie pojedynczego pliku skryptu php, który jest wywoływany przed każdym innym skryptem, takim jak pospolite.php lub pagestart.php itp.

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

Użycie skryptu jest dość proste:

$ip = getRequestIP();
$cf = isCloudflare();

if($cf) echo "Cloudflare :D<br>";
else    echo "Not cloudflare o_0";

echo "Your actual ip address is: ". $ip;

Ten skrypt pokaże Ci prawdziwy adres ip i czy żądanie jest CF czy nie!

 6
Author: Callum Carmicheal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:43

Trudno byłoby przekonwertować HTTP_CF_CONNECTING_IP na REMOTE_ADDR. Więc możesz użyć apache (.htaccess) automatyczne prepending, aby to zrobić. Tak, że nie trzeba myśleć o tym, czy $_SERVER['REMOTE_ADDR'] ma poprawną wartość we wszystkich skryptach PHP.

.kod htaccess

php_value auto_prepend_file "/path/to/file.php"

Kod Php (plik.php)

<?php

define('CLIENT_IP', isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']);

Dowiedz się więcej tutaj

 2
Author: Supun Kavinda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 13:45:47

Dla magento 1.x Użytkowników (nie próbowałem jeszcze magento 2.0), sprawdź https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the-right-way / który wymaga zmiany aplikacji / etc / local.xml i dodaj: HTTP_CF_CONNECTING_IP

 0
Author: xinqiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 03:44:38

HTTP_CF_CONNECTING_IP działa tylko wtedy, gdy używasz cloudflare może przenieść swoją witrynę lub usunąć cloudflare zapomnisz wartość, więc użyj tego kodu .

$ip=$_SERVER["HTTP_CF_CONNECTING_IP"];
if (!isset($ip)) {
  $ip = $_SERVER['REMOTE_ADDR'];
}
 0
Author: RootTools,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-17 13:36:54

Kiedy używasz CloudFlare wszystkie Twoje żądania między serwerem a użytkownikami są kierowane przez serwery CloudFlare.

W tym przypadku istnieją dwie metody uzyskania prawdziwego adresu IP Użytkownika:

  1. poprzez dodatkowe nagłówki serwera dodane przez serwery CloudFlare
  2. Dodanie modułu CloudFlare Apache/NGINX na serwerze.

Metoda 1: Get IP though extra Server Headers

Możesz użyć poniższego kodu, aby uzyskać adres IP użytkownika Adres:

$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"]) $_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);

Jak to działa?

CloudFlare dodaje kilka dodatkowych zmiennych serwera w żądaniu w następujący sposób:

$_SERVER["HTTP_CF_CONNECTING_IP"] - rzeczywisty adres IP użytkownika

$_SERVER["HTTP_CF_IPCOUNTRY"] - ISO2 kraj Użytkownika

$_SERVER["HTTP_CF_RAY"] specjalny łańcuch do celów loggin

W powyższym kodzie sprawdzamy czy $_SERVER["HTTP_CF_CONNECTING_IP"] jest ustawione czy nie. Jeśli tam jest, weźmiemy pod uwagę, że jako adres IP użytkownika w przeciwnym razie użyjemy domyślnego kodu jako $_SERVER['REMOTE_ADDR']

Metoda 2: Instalacja Cloudflare Moduł na twoim serwerze

 0
Author: Ashutosh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-12 23:22:06