通过在PHP的CloudFlare和记录访问者的IP地址(CloudFlare and loggin

2019-07-20 06:17发布

我试图跟踪和记录用户/观众正在访问使用PHP的我的网站, $_SERVER['REMOTE_ADDR']这样做。 对于IP地址的PHP跟踪的典型方法。

但是,我使用了缓存和这样的CloudFlare和接受他们的IP地址作为CloudFlare的:

108.162.212。* - 。108.162.239 *

什么是检索实际用户/访问者IP地址,而仍然使用的CloudFlare的正确方法是什么?

Answer 1:

额外的服务器变量可用云耀斑是:

$_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地址的有效性是非常重要的,你可能需要验证$_SERVER["REMOTE_ADDR"]包含一个实际有效的CloudFlare的IP地址,因为任何人都可以伪造的头,如果他能够连接直接到服务器IP。



Answer 2:

由于这个问题被提出和回答,CloudFlare的发布mod_cloudflare为Apache,它记录和显示实际访问者的IP地址,而不是CloudFlare的地址:

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



Answer 3:

CloudFlare的发送一些额外的请求头到您的服务器,包括CF-Connecting-IP ,我们可以存入$user_ip ,如果定义,使用这种简单的一行:

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


Answer 4:

我重写我的答案我用另外一个问题“ 的CloudFlare DNS / IP直接标识 ”

CloudFlare的IPS存储在公共所以你可以去查看他们在这里然后检查IP是从CloudFlare的(这将使我们能够获得来自HTTP标头的真实IP HTTP_CF_CONNECTING_IP )。

如果你正使用该禁用所有非CF连接或反之亦然,我建议你有一个被所有其他脚本之前称为单一的PHP脚本文件如的common.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还是不行!



Answer 5:

这将是很难HTTP_CF_CONNECTING_IP转换为REMOTE_ADDR。 所以,你可以使用Apache(.htaccess)是否自动预先考虑这样做。 所以,你不必去想是否$_SERVER['REMOTE_ADDR']在所有的PHP脚本正确的值。

的.htaccess代码

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

PHP代码(file.php)

<?php

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

了解更多点击这里



Answer 6:

如果你正在使用的CloudFlare也许你将您的网站或删除的CloudFlare你会忘记值,以便使用此代码HTTP_CF_CONNECTING_IP只工作。

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


Answer 7:

对于Magento的1.x的用户(我还没有尝试的Magento 2.0还),检查https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the-正确的路/它需要改变应用程序的/ etc / local.xml中并添加:HTTP_CF_CONNECTING_IP



Answer 8:

当您使用的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"]特殊字符串为宗旨洛

在上面的代码中,如果我们正在检查$_SERVER["HTTP_CF_CONNECTING_IP"]设置与否。 如果它的存在,我们将考虑其他如用户的IP地址,我们将使用默认的代码$_SERVER['REMOTE_ADDR']

方法2:在服务器上安装的CloudFlare模块

  • Apache服务器上安装的CloudFlare模块
  • NGINX服务器上安装的CloudFlare模块
  • 上EasyApache +的cPanel安装的CloudFlare模块


文章来源: CloudFlare and logging visitor IP addresses via in PHP