Nice programing

CloudFlare 및 PHP를 통해 방문자 IP 주소 로깅

nicepro 2020. 10. 22. 22:45
반응형

CloudFlare 및 PHP를 통해 방문자 IP 주소 로깅


PHP를 사용하여 내 웹 사이트에 액세스하는 사용자 / 방문자를 추적하고 기록하려고합니다 $_SERVER['REMOTE_ADDR']. PHP에서 IP 주소를 추적하는 일반적인 방법입니다.

그러나 저는 캐싱 등에 CloudFlare를 사용하고 있으며 CloudFlare의 IP 주소를 수신하고 있습니다.

108.162.212. *-108.162.239. *

CloudFlare를 계속 사용하면서 실제 사용자 / 방문자 IP 주소를 검색하는 올바른 방법은 무엇입니까?


클라우드 플레어에 사용할 수있는 추가 서버 변수는 다음과 같습니다.

$_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"]경우 서버 IP에 직접 연결할 수 있으면 누구나 헤더를 위조 할 수 있으므로에 실제 유효한 cloudflare IP 주소 포함되어 있는지 확인해야 할 수 있습니다 .


이 질문에 대한 질문과 답변 이후 CloudFlare는 CloudFlare mod_cloudflare주소가 아닌 실제 방문자 IP 주소를 기록하고 표시하는 Apache 용으로 출시 되었습니다.

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


업데이트 : CloudFlare는 mod_cloudflare아파치 용 모듈 출시했습니다. 모듈 은 cloudflare가 액세스하는 것이 아닌 실제 방문자 IP 주소를 기록하고 표시합니다! https://www.cloudflare.com/resources-downloads#mod_cloudflare (답변 : olimortimer )

아파치 런타임에 액세스 할 수없는 경우 아래 스크립트를 사용할 수 있습니다. 이렇게하면 연결이 cloudflare를 통해 이루어 졌는지 확인하고 사용자 IP를 얻을 수 있습니다.

다른 질문 " CloudFlare DNS / 직접 IP 식별자 "에 사용한 내 답변을 다시 작성하고 있습니다.

Cloudflare의 ip는 공개되어 있으므로 여기에서 확인한 다음 ip가 cloudflare에서 온 것인지 확인할 수 있습니다 (이를 통해 http 헤더에서 실제 IP를 가져올 수 있습니다 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 "Connection is through cloudflare: <br>";
else    echo "Connection is not through cloudflare: <br>";

echo "Your actual ip address is: ". $ip;
echo "The server remote address header is: ". $_SERVER['REMOTE_ADDR'];

이 스크립트는 실제 IP 주소와 요청이 CF인지 여부를 보여줍니다!


Cloudflare sends some additional request headers to your server including CF-Connecting-IP which we can store into $user_ip, if defined, using this simple one-liner:

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

It would be hard to convert HTTP_CF_CONNECTING_IP to REMOTE_ADDR. So you can use apache (.htaccess) auto prepending to do that. So that you do not need to think about whether the $_SERVER['REMOTE_ADDR'] has the correct value in all the PHP scripts.

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

Learn More here


HTTP_CF_CONNECTING_IP is only working if you are using cloudflare maybe you transfer your site or remove cloudflare you will forget the value so use this code .

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

For magento 1.x users (I haven't try magento 2.0 yet), check https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the-right-way/ which needs to change app/etc/local.xml and add: HTTP_CF_CONNECTING_IP


When you are using CloudFlare all your requests between your server and users are routed through CloudFlare servers.

In this case there are two methods to get User's Real IP Address:

  1. Through Extra Server Headers added by CloudFlare Servers
  2. Adding a CloudFlare Apache/NGINX Module on your server.

Method 1: Get IP though extra Server Headers

You can use the following code to get user's IP Address:

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

How it is working?

CloudFlare adds some extra server variables in the request as follows:

$_SERVER["HTTP_CF_CONNECTING_IP"] - Real IP Address of user

$_SERVER["HTTP_CF_IPCOUNTRY"] - ISO2 Country of the User

$_SERVER["HTTP_CF_RAY"] A Special string for loggin purpose

In the above code, we are checking if $_SERVER["HTTP_CF_CONNECTING_IP"] is set or not. If it is there we will consider that as user's IP Address else we will use the default code as $_SERVER['REMOTE_ADDR']

Method 2: Installing Cloudflare Module on your server

참고URL : https://stackoverflow.com/questions/14985518/cloudflare-and-logging-visitor-ip-addresses-via-in-php

반응형