php - पहच - प्रोटोकॉल म्हणजे काय




PHP में क्लाइंट आईपी पता कैसे प्राप्त करें? (15)

मैं PHP का उपयोग कर क्लाइंट आईपी पता कैसे प्राप्त कर सकता हूं?

मैं उस उपयोगकर्ता का रिकॉर्ड रखना चाहता हूं जिसने अपनी वेबसाइट में अपने आईपी पते के माध्यम से लॉग इन किया है।


इंटरनेट के पीछे विभिन्न प्रकार के उपयोगकर्ता हैं, इसलिए हम विभिन्न औषधि से आईपी पता पकड़ना चाहते हैं। वो हैं,

1. $_SERVER['REMOTE_ADDR'] - इसमें क्लाइंट का असली आईपी पता शामिल है। यह उपयोगकर्ता से प्राप्त सबसे विश्वसनीय मूल्य है।

2. $_SERVER['REMOTE_HOST'] - यह होस्ट नाम लाएगा जिससे उपयोगकर्ता वर्तमान पृष्ठ देख रहा है। लेकिन इस स्क्रिप्ट के लिए काम करने के लिए, httpd.conf के अंदर होस्टनाम लुकअप कॉन्फ़िगर किया जाना चाहिए।

3. $_SERVER['HTTP_CLIENT_IP'] - जब उपयोगकर्ता साझा इंटरनेट सेवाओं से होता है तो यह आईपी पता $_SERVER['HTTP_CLIENT_IP']

4. $_SERVER['HTTP_X_FORWARDED_FOR'] - यह प्रॉक्सी के पीछे होने पर उपयोगकर्ता से आईपी पता $_SERVER['HTTP_X_FORWARDED_FOR']

इसलिए हम अलग-अलग पदों में देख रहे उपयोगकर्ताओं से वास्तविक आईपी पता प्राप्त करने के लिए इस निम्नलिखित संयुक्त फ़ंक्शन का उपयोग कर सकते हैं,

// Function to get the user IP address
function getUserIP() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

इसे $_SERVER['REMOTE_ADDR'] चर में निहित होना चाहिए।


उसके जैसा????

if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',validate_ip))===false or empty($ip)){
  exit;
  }
echo $ip;

पुनश्च

if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',FILTER_VALIDATE_IP|FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE))===false){
  header('HTTP/1.0 400 Bad Request');
  exit;
}

'HTTP_' या 'X-' से शुरू होने वाले सभी शीर्षलेख क्रमशः उपयोगकर्ता परिभाषित किए गए हैं। यदि आप ट्रैक उपयोग कोयोज़ आदि रखना चाहते हैं।


क्लाइंट का आईपी पता प्राप्त करने वाला एक-लाइनर संस्करण यहां दिया गया है:

$ip = @$_SERVER['HTTP_CLIENT_IP'] ?: @$_SERVER['HTTP_X_FORWARDED_FOR'] ?: @$_SERVER['REMOTE_ADDR'];

टिप्पणियाँ:

  • @ का उपयोग करके, यह PHP नोटिस को दबा देता है।
  • HTTP_X_FORWARDED_FOR से मान में अल्पविराम से अलग कई पते हो सकते हैं, इसलिए यदि आप पहले व्यक्ति को प्राप्त करना पसंद करते हैं, तो आप निम्न विधि का उपयोग कर सकते हैं:

    current(explode(',', @$_SERVER['HTTP_X_FORWARDED_FOR']))
    

जवाब $_SERVER चर का उपयोग करना है। उदाहरण के लिए, $_SERVER["REMOTE_ADDR"] ग्राहक के आईपी पते को वापस कर देगा।


जैसा कि आप दूसरों ने $_SERVER['REMOTE_ADDR']; उपयोग करने से पहले कहा था $_SERVER['REMOTE_ADDR']; ग्राहक आईपी पता प्राप्त करने के लिए।

साथ ही, यदि आपको किसी उपयोगकर्ता के बारे में अधिक जानकारी चाहिए, तो आप इसका उपयोग कर सकते हैं:

<?php
    $ip='0.0.0.0';
    $ip=$_SERVER['REMOTE_ADDR'];
    $clientDetails = json_decode(file_get_contents("http://ipinfo.io/$ip/json"));
    echo "You're logged in from: <b>" . $clientDetails->country . "</b>";
?>

क्लाइंट की अधिक विशिष्ट जानकारी $ ग्राहक में जाती है विवरण।
आप $ क्लाइंट में संग्रहीत जेसन आइटम प्राप्त कर सकते हैं इस प्रकार वैरिएबल वैरिएबल: $ क्लाइंट विवरण-> पोस्टलकोड / होस्टनाम / क्षेत्र / लोक ...

मैं अतिरिक्त जानकारी प्राप्त करने के लिए ipinfo.io का उपयोग कर रहा हूँ।

मुझे उम्मीद है यह मदद करेगा।


मुझे यह कोडपिपेट पसंद है:

function getClientIP() {

    if (isset($_SERVER)) {

        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
            return $_SERVER["HTTP_X_FORWARDED_FOR"];

        if (isset($_SERVER["HTTP_CLIENT_IP"]))
            return $_SERVER["HTTP_CLIENT_IP"];

        return $_SERVER["REMOTE_ADDR"];
    }

    if (getenv('HTTP_X_FORWARDED_FOR'))
        return getenv('HTTP_X_FORWARDED_FOR');

    if (getenv('HTTP_CLIENT_IP'))
        return getenv('HTTP_CLIENT_IP');

    return getenv('REMOTE_ADDR');
}

मेरा पसंदीदा समाधान जेन फ्रेमवर्क 2 का उपयोग करता है। यह $_SERVER गुण HTTP_X_FORWARDED_FOR , HTTP_CLIENT_IP , REMOTE_ADDR पर भी विचार करता है लेकिन यह कुछ विश्वसनीय प्रॉक्सी सेट करने के लिए एक वर्ग घोषित करता है और यह एक आईपी पता देता है जो सरणी नहीं है। मुझे लगता है कि यह वह समाधान है जो इसके सबसे नज़दीक आता है:

class RemoteAddress
{
    /**
     * Whether to use proxy addresses or not.
     *
     * As default this setting is disabled - IP address is mostly needed to increase
     * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
     * just for more flexibility, but if user uses proxy to connect to trusted services
     * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
     *
     * @var bool
     */
    protected $useProxy = false;

    /**
     * List of trusted proxy IP addresses
     *
     * @var array
     */
    protected $trustedProxies = array();

    /**
     * HTTP header to introspect for proxies
     *
     * @var string
     */
    protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';

    // [...]

    /**
     * Returns client IP address.
     *
     * @return string IP address.
     */
    public function getIpAddress()
    {
        $ip = $this->getIpAddressFromProxy();
        if ($ip) {
            return $ip;
        }

        // direct IP address
        if (isset($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        }

        return '';
    }

    /**
     * Attempt to get the IP address for a proxied client
     *
     * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
     * @return false|string
     */
    protected function getIpAddressFromProxy()
    {
        if (!$this->useProxy
            || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
        ) {
            return false;
        }

        $header = $this->proxyHeader;
        if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
            return false;
        }

        // Extract IPs
        $ips = explode(',', $_SERVER[$header]);
        // trim, so we can compare against trusted proxies properly
        $ips = array_map('trim', $ips);
        // remove trusted proxy IPs
        $ips = array_diff($ips, $this->trustedProxies);

        // Any left?
        if (empty($ips)) {
            return false;
        }

        // Since we've removed any known, trusted proxy servers, the right-most
        // address represents the first IP we do not know about -- i.e., we do
        // not know if it is a proxy server, or a client. As such, we treat it
        // as the originating IP.
        // @see http://en.wikipedia.org/wiki/X-Forwarded-For
        $ip = array_pop($ips);
        return $ip;
    }

    // [...]
}

यहां पूरा कोड देखें: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php


यह वह तरीका है जिसका मैं उपयोग करता हूं, और यह IPv4 इनपुट को मान्य करता है:

// Get user IP address
if ( isset($_SERVER['HTTP_CLIENT_IP']) && ! empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
}

$ip = filter_var($ip, FILTER_VALIDATE_IP);
$ip = ($ip === false) ? '0.0.0.0' : $ip;

यह सबसे उन्नत तरीका है जो मैंने पाया है, पहले से ही कुछ अन्य लोगों की कोशिश की है। आगंतुक के आईपी पते को सुनिश्चित करने के लिए मान्य (लेकिन कृपया ध्यान दें कि कोई भी हैकर आसानी से आईपी पते को गलत साबित कर सकता है)।

function get_ip_address() {
    // check for shared internet/ISP IP
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    }

    // check for IPs passing through proxies
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // check if multiple ips exist in var
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
            $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($iplist as $ip) {
                if (validate_ip($ip))
                    return $ip;
            }
        } else {
            if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
                return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
        return $_SERVER['HTTP_X_FORWARDED'];
    if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
        return $_SERVER['HTTP_FORWARDED_FOR'];
    if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
        return $_SERVER['HTTP_FORWARDED'];

    // return unreliable ip since all else failed
    return $_SERVER['REMOTE_ADDR'];
}

/**
 * Ensures an ip address is both a valid IP and does not fall within
 * a private network range.
 */
function validate_ip($ip) {
    if (strtolower($ip) === 'unknown')
        return false;

    // generate ipv4 network address
    $ip = ip2long($ip);

    // if the ip is set and not equivalent to 255.255.255.255
    if ($ip !== false && $ip !== -1) {
        // make sure to get unsigned long representation of ip
        // due to discrepancies between 32 and 64 bit OSes and
        // signed numbers (ints default to signed in PHP)
        $ip = sprintf('%u', $ip);
        // do private network range checking
        if ($ip >= 0 && $ip <= 50331647) return false;
        if ($ip >= 167772160 && $ip <= 184549375) return false;
        if ($ip >= 2130706432 && $ip <= 2147483647) return false;
        if ($ip >= 2851995648 && $ip <= 2852061183) return false;
        if ($ip >= 2886729728 && $ip <= 2887778303) return false;
        if ($ip >= 3221225984 && $ip <= 3221226239) return false;
        if ($ip >= 3232235520 && $ip <= 3232301055) return false;
        if ($ip >= 4294967040) return false;
    }
    return true;
}

स्रोत: http://blackbe.lt/advanced-method-to-obtain-the-client-ip-in-php/


$_SERVER['REMOTE_ADDR'] वास्तव में वास्तविक क्लाइंट आईपी पते नहीं हो सकते हैं, क्योंकि यह आपको प्रॉक्सी से जुड़े क्लाइंट के लिए प्रॉक्सी पता देगा, उदाहरण के लिए। यह वही हो सकता है जो आप वास्तव में चाहते हैं, हालांकि, आईपी के साथ आप क्या कर रहे हैं इसके आधार पर। यदि आप कह रहे हैं कि आपका ट्रैफ़िक कहां से शुरू हो रहा है, या यह याद रखना कि उपयोगकर्ता किस आईपी से पिछली बार कनेक्ट है, जहां प्रॉक्सी या एनएटी गेटवे का सार्वजनिक आईपी अधिक हो सकता है, तो किसी का निजी आरएफसी 1 9 18 पता आपको कोई अच्छा नहीं कर सकता है स्टोर करने के लिए उपयुक्त है।

X-Forwarded-For जैसे कई HTTP शीर्षलेख X-Forwarded-For जिसके X-Forwarded-For विभिन्न प्रॉक्सी द्वारा सेट किया जा सकता है या नहीं। समस्या यह है कि वे केवल HTTP शीर्षलेख हैं जिन्हें किसी के द्वारा सेट किया जा सकता है। उनकी सामग्री के बारे में कोई गारंटी नहीं है। $_SERVER['REMOTE_ADDR'] वास्तविक भौतिक आईपी पता है जिसे वेब सर्वर से कनेक्शन प्राप्त हुआ और प्रतिक्रिया भेजी जाएगी। कुछ और सिर्फ मनमानी और स्वैच्छिक जानकारी है। केवल एक ही परिदृश्य है जिसमें आप इस जानकारी पर भरोसा कर सकते हैं: आप प्रॉक्सी को नियंत्रित कर रहे हैं जो इस हेडर को सेट करता है। मतलब केवल तभी होता है जब आप जानते हैं कि 100% कहां और कैसे हेडर सेट किया गया था, क्या आपको इसे किसी भी महत्व के लिए ध्यान देना चाहिए।

ऐसा कहकर, यहां कुछ नमूना कोड है:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

संपादक का नोट: उपरोक्त कोड का उपयोग सुरक्षा प्रभाव पड़ता है । ग्राहक सभी HTTP शीर्षलेख जानकारी (यानी $_SERVER['HTTP_... ) को किसी भी मनमानी मूल्य के अनुसार सेट कर सकता है। जैसे कि यह $_SERVER['REMOTE_ADDR'] का उपयोग करने के लिए कहीं अधिक विश्वसनीय है, क्योंकि यह उपयोगकर्ता द्वारा सेट नहीं किया जा सकता है।

प्रेषक: http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html


आप जो कुछ भी करते हैं, सुनिश्चित करें कि ग्राहक से भेजे गए डेटा पर भरोसा न करें। $_SERVER['REMOTE_ADDR'] में कनेक्टिंग पार्टी का असली आईपी पता शामिल है। यह सबसे विश्वसनीय मूल्य है जिसे आप पा सकते हैं।

हालांकि, वे प्रॉक्सी सर्वर के पीछे हो सकते हैं, जिस स्थिति में प्रॉक्सी ने $_SERVER['HTTP_X_FORWARDED_FOR'] सेट कर दिया हो, लेकिन यह मान आसानी से $_SERVER['HTTP_X_FORWARDED_FOR'] है। उदाहरण के लिए, इसे प्रॉक्सी के बिना किसी द्वारा सेट किया जा सकता है, या आईपी प्रॉक्सी के पीछे लैन से एक आंतरिक आईपी हो सकता है।

इसका अर्थ यह है कि यदि आप $_SERVER['HTTP_X_FORWARDED_FOR'] को सहेजने जा रहे हैं, तो सुनिश्चित करें कि आप $_SERVER['REMOTE_ADDR'] मूल्य भी सहेज लें। अपने डेटाबेस में विभिन्न फ़ील्ड में दोनों मानों को सहेजकर।

यदि आप एक स्ट्रिंग के रूप में डेटाबेस में आईपी को सहेजने जा रहे हैं, तो सुनिश्चित करें कि आपके पास कम से कम 45 वर्णों के लिए स्थान है। IPv6 यहां रहने के लिए है और वे पते पुराने आईपीवी 4 पते से बड़े हैं।

(ध्यान दें कि आईपीवी 6 आमतौर पर 39 अक्षरों का उपयोग करता है लेकिन आईपीवी 4 पतों के लिए एक विशेष आईपीवी 6 नोटेशन भी है जो इसके पूर्ण रूप में 45 वर्ण तक हो सकता है। इसलिए यदि आप जानते हैं कि आप क्या कर रहे हैं तो आप 39 अक्षरों का उपयोग कर सकते हैं, लेकिन यदि आप बस इसे सेट करना और भूलना चाहते हैं, 45 का उपयोग करें)।


$_SERVER['REMOTE_ADDR'];

उदाहरण:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

$ip = "";

if (!empty($_SERVER["HTTP_CLIENT_IP"]))
{
 //check for ip from share internet
 $ip = $_SERVER["HTTP_CLIENT_IP"];
}
elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
{
 // Check for the Proxy User
 $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
else
{
 $ip = $_SERVER["REMOTE_ADDR"];
}
echo $ip;

function get_client_ip() 
{
   $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';

   return $ipaddress;
} 




ip-address