CloudFlare और लॉगिंग विज़िटर IP पता PHP के माध्यम से


82

मैं उन उपयोगकर्ताओं / आगंतुकों को ट्रैक और लॉग इन करने की कोशिश कर रहा हूं जो ऐसा करने के लिए मेरी वेबसाइट का उपयोग कर रहे हैं $_SERVER['REMOTE_ADDR']। PHP में आईपी एड्रेस ट्रैकिंग के लिए एक विशिष्ट विधि।

हालांकि, मैं कैशिंग के लिए CloudFlare का उपयोग कर रहा हूं और ऐसे ही CloudFlare के रूप में उनके IP पते प्राप्त कर रहा हूं:

108.162.212। * - 108.162.239। *

CloudFlare का उपयोग करते समय वास्तविक उपयोगकर्ताओं / आगंतुकों के आईपी पते को पुनर्प्राप्त करने का एक सही तरीका क्या होगा?

जवाबों:


241

अतिरिक्त सर्वर चर जो बादल भड़कने के लिए उपलब्ध हैं:

$_SERVER["HTTP_CF_CONNECTING_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"];
}

यदि आप ऐसा करते हैं, और विज़िटिंग आईपी पते की वैधता महत्वपूर्ण है, तो आपको यह सत्यापित करने की आवश्यकता हो सकती है कि $_SERVER["REMOTE_ADDR"]इसमें एक वास्तविक वैध क्लाउडफ़्लरे आईपी पता है, क्योंकि कोई भी हेडर को नकली कर सकता है यदि वह सर्वर आईपी से सीधे जुड़ने में सक्षम था।


16
REMOTE_ADDR को असली IP से बदलने के लिए +1, इसलिए कोड में किसी अन्य संशोधन की आवश्यकता नहीं है।
आलाप

11
यदि सुरक्षा मामलों में किसी को जांचना चाहिए कि क्या अनुरोध क्लाउडफेयर आईपी रेंज ( Cloudflare.com/ips ) से आता है । उदाहरण के लिए, इस जूमला में! प्लगइन: github.com/piccaso/joomla-cf/blob/master/cf/cf.php
फ्लोरियन फ़िदा

Cloudflare का यह कोड उनकी साइट पर सूचीबद्ध है। support.cloudflare.com/hc/en-us/articles/…
C0nw0nk

सबसे अच्छा जवाब, लेकिन यह भी HTTP_CF_IPCOUNTRY सहित के लिए यश, मैं उस एक से पहले नहीं आया था।
डेविड बेल

http_cf_connecting_ip कभी-कभी ऐसी चीजें देता है: 2a01: 6500: a043: 33a6: b36a: 7259: 4de5: 2500 कोई विचार क्यों?
माइकल

15

अपडेट : CloudFlare ने mod_cloudflareअपाचे के लिए एक मॉड्यूल जारी किया है , यह मॉड्यूल क्लाउडफेयर द्वारा एक्सेस किए जाने के बजाय वास्तविक विज़िटर आईपी एड्रेस को लॉग इन और प्रदर्शित करेगा! https://www.cloudflare.com/resources-downloads#mod_cloudflare (द्वारा उत्तर: olimortimer )

यदि आपके पास अपाचे रनटाइम तक पहुंच नहीं है, तो आप नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं, यह आपको यह जांचने की अनुमति देगा कि क्या कनेक्शन क्लाउडफेयर के माध्यम से था और उपयोगकर्ताओं को आईपी मिला।

मैं अपना उत्तर फिर से लिख रहा हूँ जिसका उपयोग मैंने एक और प्रश्न के लिए किया था " CloudFlare DNS / direct IP आइडेंटिफ़ायर "

Cloudflare के ips को सार्वजनिक रूप से संग्रहीत किया जाता है ताकि आप उन्हें यहां देख सकें, फिर जांचें कि क्या ipflflare से है (यह हमें http हेडर से वास्तविक आईपी प्राप्त करने की अनुमति देगा 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 "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 प्राप्त कर सकते हैं: cloudflare.com/ips आदर्श रूप में, आपको इन्हें एक फ़ाइल में संग्रहित करना चाहिए ताकि आपको केवल बाहरी फ़ाइल को अपडेट करना पड़े या इससे भी बेहतर, समय-समय पर उन्हें यहां से लाना होगा: cloudflare.com/ips-v4
राफार्क

11

चूंकि यह सवाल पूछा गया था और जवाब दिया गया था, CloudFlare ने mod_cloudflareApache के लिए जारी किया है, जो CloudFlare पते के बजाय वास्तविक आगंतुक IP पते को लॉग और प्रदर्शित करता है:

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


2019 - वे अब समर्थन नहीं करते हैं mod_cloudflare, फिर भी इसका उपयोग किया जा सकता है। कुछ नया कहा जाता है mod_remoteip। संदर्भ: support.cloudflare.com/hc/en-us/articles/…
सिनाज़ा

@ सिनाज़ा शायद एक नया जवाब बनाने के लिए सबसे अच्छा है, जैसा कि मेरा जवाब mod_cloudflare4 साल पहले से था
ओलीमोर्टिमर

@sjagr आपके संपादन के संबंध में, वे गलत हैं - CloudFlare वास्तव में Cloudflare है, जैसा कि मैंने मूल रूप से पोस्ट किया है
olimortimer

10

Cloudflare आपके सर्वर पर कुछ अतिरिक्त अनुरोध हेडर भेजता है CF-Connecting-IPजिसमें हम $user_ipइस सरल वन-लाइनर का उपयोग करके परिभाषित किया जा सकता है , जिसमें हम स्टोर कर सकते हैं:

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

इसके साथ समस्या यह है कि यह सिर्फ एक साधारण हेडर है, इसलिए कोई भी इसे केवल आईपी पर सेट कर सकता है जो वे चाहते हैं जो एक बड़ी सुरक्षा भेद्यता है।
रफार्क

@rafark यदि आपका सर्वर ठीक से कॉन्फ़िगर नहीं किया गया है और Cloudflare के पीछे है।
सायण

हां बिल्कुल। यह se का एक अच्छा समाधान है लेकिन HTTP_CF_CONNECTING_IP का उपयोग करने से पहले चेक किया जाना चाहिए, जैसे Callum के उत्तर में
rafark

@ क्राफ्ट मैं भी सहमत हूँ, लेकिन यह PHP कोड का एक बहुत बड़ा हिस्सा है जो पहले से ही आपके अपाचे कॉन्फ़िगरेशन (मुझे आशा है) में एक और रूप में मौजूद है और यह कोड आसान डिबगिंग के लिए अनुमति देने के लिए अधिक है और अगर किसी हमलावर को आपके डीबगिंग वातावरण तक पहुंच है, तो मुझे लगता है इससे निपटने के लिए आपके पास अधिक महत्वपूर्ण समस्याएं हैं।
सायण

2

HTTP_CF_CONNECTING_IP को REMOTE_ADDR में बदलना कठिन होगा। तो आप अपाचे (.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']);

यहाँ और जानें


1

HTTP_CF_CONNECTING_IP केवल तभी काम कर रहा है जब आप क्लाउडफ़ेयर का उपयोग कर रहे हैं, हो सकता है कि आप अपनी साइट को स्थानांतरित कर दें या क्लाउडफ़ेयर को हटा दें, आप मान भूल जाएंगे इसलिए इस कोड का उपयोग करें।

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

1

लारवेल में निम्नलिखित पंक्ति जोड़ें AppServiceProvider:

...
use Symfony\Component\HttpFoundation\Request;


...
public function boot()
{
    Request::setTrustedProxies(['REMOTE_ADDR'], Request::HEADER_X_FORWARDED_FOR);
}

अब आप वास्तविक ग्राहक आईपी का उपयोग कर प्राप्त कर सकते हैं request()->ip()

और अधिक पढ़ें यहाँ



0

जब आप CloudFlare का उपयोग कर रहे हैं तो आपके सर्वर और उपयोगकर्ताओं के बीच आपके सभी अनुरोध CloudFlare सर्वर के माध्यम से रूट किए जाते हैं।

इस मामले में उपयोगकर्ता के वास्तविक आईपी पते को प्राप्त करने के दो तरीके हैं:

  1. CloudFlare Servers द्वारा जोड़े गए अतिरिक्त सर्वर हेडर के माध्यम से
  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"] - उपयोगकर्ता का वास्तविक आईपी पता

$_SERVER["HTTP_CF_IPCOUNTRY"] - उपयोगकर्ता का ISO2 देश

$_SERVER["HTTP_CF_RAY"] Loggin उद्देश्य के लिए एक विशेष स्ट्रिंग

उपरोक्त कोड में, हम $_SERVER["HTTP_CF_CONNECTING_IP"]सेट या नहीं जाँच रहे हैं । यदि यह वहां है तो हम विचार करेंगे कि उपयोगकर्ता के आईपी पते के रूप में हम डिफ़ॉल्ट कोड का उपयोग करेंगे$_SERVER['REMOTE_ADDR']

विधि 2: अपने सर्वर पर Cloudflare मॉड्यूल इंस्टॉल करना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.