CloudFlare и регистрация IP-адресов посетителей через PHP

Я пытаюсь отслеживать и регистрировать пользователей / посетителей, которые обращаются к моему сайту, используя PHP $_SERVER['REMOTE_ADDR'] сделать это. Типичный метод отслеживания IP-адресов в PHP.

однако я использую CloudFlare для кэширования и таких и получения их IP-адресов, как CloudFlare:

108.162.212.* - 108.162.239.*

каким будет правильный метод получения фактического IP-адреса пользователей/посетителей при использовании CloudFlare?

8 ответов


дополнительные переменные сервера, доступные для cloud flare:

$_SERVER["HTTP_CF_CONNECTING_IP"] реальный IP-адрес посетителя, это то, что вы хотите

$_SERVER["HTTP_CF_IPCOUNTRY"] страна посетителя

$_SERVER["HTTP_CF_RAY"] описание здесь

$_SERVER["HTTP_CF_VISITOR"] это может помочь вам узнать, если его http или https

вы можете использовать его как это:

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

если вы это сделаете, и действительность посещения IP-адреса важна, Вам может потребоваться проверить, что the $_SERVER["REMOTE_ADDR"] содержит действительный действительный IP-адрес cloudflare, потому что любой может подделать заголовок, если он смог подключиться непосредственно к IP-серверу.


Так как этот вопрос был задан и ответил, CloudFlare выпустила mod_cloudflare для Apache, который регистрирует и отображает фактический IP-адрес посетителя, а не адрес CloudFlare:

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


Cloudflare отправляет некоторые дополнительные заголовки запросов на ваш сервер, включая CF-Connecting-IP что мы можем хранить в $user_ip, Если определено, используя этот простой однострочный:

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

я переписываю свой ответ, который я использовал для другого вопроса"Cloudflare DNS / прямой идентификатор IP"

ips Cloudflare хранятся в общественных местах, так что вы можете пойти посмотреть их здесь затем проверьте, является ли ip от cloudflare (это позволит нам получить реальный ip из HTTP-заголовка HTTP_CF_CONNECTING_IP).

Если вы используете это, чтобы отключить все соединения non cf или наоборот, я рекомендую вам иметь один файл скрипта php, который вызывается перед каждым другой сценарий, такой как общий.php или pagestart.PHP и др.

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

использовать скрипт довольно просто:

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

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

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

этот скрипт покажет вам реальный ip-адрес, и если запрос CF или нет!


было бы трудно преобразовать HTTP_CF_CONNECTING_IP в REMOTE_ADDR. Таким образом, вы можете использовать apache (.htaccess) auto prepending для этого. Так что вам не нужно думать о том,$_SERVER['REMOTE_ADDR'] имеет правильное значение во всех скриптах PHP.

.реврайт код

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

PHP-код (файл.в PHP)

<?php

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

Узнать Больше здесь


для magento 1.x пользователи (я еще не пробовал magento 2.0), проверьте https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the-right-way/ который должен изменить app / etc / local.XML и добавить: HTTP_CF_CONNECTING_IP


HTTP_CF_CONNECTING_IP работает только в том случае, если вы используете cloudflare возможно, вы перенесете свой сайт или удалите cloudflare вы забудете значение, поэтому используйте этот код .

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

при использовании CloudFlare все ваши запросы между сервером и пользователями маршрутизируются через серверы CloudFlare.

в этом случае есть два способа получить реальный IP-адрес пользователя:

  1. через дополнительные заголовки серверов, добавленные серверами CloudFlare
  2. добавление модуля CloudFlare Apache/NGINX на ваш сервер.

метод 1: получить IP, хотя дополнительные заголовки сервера

вы можете использовать следующий код, чтобы получить IP-адрес пользователя:

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

как это работает?

CloudFlare добавляет некоторые дополнительные переменные сервера в запрос следующим образом:

$_SERVER["HTTP_CF_CONNECTING_IP"] - реальный IP-адрес пользователя

$_SERVER["HTTP_CF_IPCOUNTRY"] - ISO2 страна пользователя

$_SERVER["HTTP_CF_RAY"] специальная строка для цели loggin

В приведенном выше коде, мы проверяем, если $_SERVER["HTTP_CF_CONNECTING_IP"] установлен или нет. Если он там, мы будем считать, что в качестве IP-адреса пользователя мы будем использовать код по умолчанию как $_SERVER['REMOTE_ADDR']

Метод 2: установка модуля Cloudflare на вашем сервере