web-dev-qa-db-ja.com

PHPを介したCloudFlareおよび訪問者のIPアドレスの記録

PHPの$_SERVER['REMOTE_ADDR']を使用して自分のWebサイトにアクセスしているユーザー/訪問者を追跡および記録しようとしています。 PHPでのIPアドレストラッキングの一般的な方法。

ただし、キャッシュなどにCloudFlareを使用し、CloudFlareのIPアドレスを受信して​​います。

108.162.212。*-108.162.239。*

CloudFlareを使用しながら実際のユーザー/訪問者のIPアドレスを取得する正しい方法は何でしょうか?

72
tfont

クラウドフレアで利用可能な追加のサーバー変数は次のとおりです。

$_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。

215
sharp12345

この質問に答えてから、CloudFlareはApache用のmod_cloudflareをリリースしました。これはCloudFlareアドレスではなく、実際の訪問者のIPアドレスを記録および表示します。

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

10
olimortimer

別の質問「 CloudFlare DNS /直接IP識別子 」で使用した回答を書き換えています

CloudflareのIPはパブリックに保存されているので、それらを表示 here してから、IPがcloudflareからのものかどうかを確認できます(これにより、実際のIPを取得できます) httpヘッダーHTTP_CF_CONNECTING_IP)。

これを使用してすべての非cf接続を無効にする場合、またはその逆の場合、common.phpやpagestart.phpなどの他のすべてのスクリプトの前に呼び出される単一の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かどうかを表示します!

8

CloudflareはCF-Connecting-IPを含む追加のリクエストヘッダーをサーバーに送信します。このヘッダーは、定義されている場合、この単純なワンライナーを使用して、$user_ipに格納できます。

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

HTTP_CF_CONNECTING_IPをREMOTE_ADDRに変換するのは難しいでしょう。そのため、Apache(.htaccess)自動プリペンディングを使用してこれを行うことができます。 $_SERVER['REMOTE_ADDR']がすべてのPHPスクリプトで正しい値を持っているかどうかを考える必要はありません。

。htaccess code

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

詳細 こちら

2
Supun Kavinda

HTTP_CF_CONNECTING_IPは、cloudflareを使用している場合にのみ機能します。サイトを転送するか、cloudflareを削除すると、値を忘れてしまうため、このコードを使用してください。

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

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

0
xinqiu

CloudFlareを使用している場合、サーバーとユーザー間のすべてのリクエストはCloudFlareサーバーを介してルーティングされます。

この場合、ユーザーの実IPアドレスを取得するには2つの方法があります。

  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モジュールをインストールする

0
Ashutosh Kumar