2012-11-30 32 views
72

मैं इस PHP कोड का उपयोग कर रहा एक आगंतुक के आईपी पते पाने के लिए:विज़िटर से वास्तविक आईपी कैसे प्राप्त करें?

<?php echo $_SERVER['REMOTE_ADDR']; ?> 

लेकिन, जब वे एक प्रॉक्सी उपयोग कर रहे हैं मैं आगंतुकों से वास्तविक आईपी पते नहीं मिल सकता है। क्या इस मामले में आगंतुक का आईपी पता पाने का कोई तरीका है?

+1

यदि आप प्रॉक्सी पूरी तरह से अज्ञात नहीं हैं तो आप केवल वास्तविक प्रॉक्सी प्राप्त कर सकते हैं अन्यथा आपको प्रॉक्सी आईपी – Prix

+0

मिल जाएगा, आप यह लिंक देख सकते हैं http://allinonescript.blogspot.in/2016/09/how -to-get-real-ip-isp-country-city-and-etc-from-visit-use-php.html –

उत्तर

127

इस PHP कोड को आज़माएं।

<?PHP 

function getUserIP() 
{ 
    $client = @$_SERVER['HTTP_CLIENT_IP']; 
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; 
    $remote = $_SERVER['REMOTE_ADDR']; 

    if(filter_var($client, FILTER_VALIDATE_IP)) 
    { 
     $ip = $client; 
    } 
    elseif(filter_var($forward, FILTER_VALIDATE_IP)) 
    { 
     $ip = $forward; 
    } 
    else 
    { 
     $ip = $remote; 
    } 

    return $ip; 
} 


$user_ip = getUserIP(); 

echo $user_ip; // Output IP address [Ex: 177.87.193.134] 


?> 
+4

आपको उस मामले को भी संभालना चाहिए जहां कई प्रॉक्सी शामिल हैं, क्यों नहीं? – Esailija

+17

यह 'HTTP_CLIENT_IP' और' HTTP_X_FORWARDED_FOR' के रूप में खराब है जाली जा सकती है। केवल 'REMOTE_ADDR' नहीं हो सकता है। –

+0

http://phpresult.com/source/share/GuAl1378725311 –

6

प्रॉक्सी HTTP_X_FORWARDED_FOR शीर्षलेख भेज सकता है लेकिन यह भी वैकल्पिक है।

यह भी ध्यान रखें कि आगंतुक आईपी पते साझा कर सकते हैं; विश्वविद्यालय नेटवर्क, बड़ी कंपनियों और तीसरे विश्व/कम बजट वाले आईएसपी कई उपयोगकर्ताओं पर आईपी साझा करते हैं।

+1

हेडर "विनिर्देशन" एकाधिक प्रॉक्सी को संभाल सकता है, आईपीएस की श्रृंखला हेडर में अल्पविराम से अलग हो जाएगी मूल्य – Esailija

+0

बस एक नोट। तीसरी दुनिया आईएसपी विपरीत है। वे प्रत्येक लॉगिन के लिए गतिशील आईपी बनाते हैं। तो प्रति उपयोगकर्ता इसके एकाधिक ips और एकाधिक उपयोगकर्ता के लिए एक आईपी नहीं। – itachi

0

हाँ, $_SERVER["HTTP_X_FORWARDED_FOR"] कैसे मैं जब मेरे nginx सर्वर पर एक प्रॉक्सी के तहत मेरे आईपी देखते हैं।

लेकिन आपकी सबसे अच्छी शर्त प्रॉक्सी के तहत अनुरोध किए गए पृष्ठ पर phpinfo() चलाने के लिए है ताकि आप सभी availabe चर देख सकें और देखें कि आपका असली आईपी क्या है।

23

यह सबसे आम तकनीक मैंने देखा है है:

function getUserIP() { 
    if(array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')>0) { 
      $addr = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']); 
      return trim($addr[0]); 
     } else { 
      return $_SERVER['HTTP_X_FORWARDED_FOR']; 
     } 
    } 
    else { 
     return $_SERVER['REMOTE_ADDR']; 
    } 
} 

ध्यान दें कि यह यह गारंटी नहीं है कि आप क्योंकि वहाँ इसे छिपाने के लिए कई तरीके हैं हमेशा सही उपयोगकर्ता आईपी मिल जाएगा।

17

यह मेरा दृष्टिकोण है:

function getRealUserIp(){ 
    switch(true){ 
     case (!empty($_SERVER['HTTP_X_REAL_IP'])) : return $_SERVER['HTTP_X_REAL_IP']; 
     case (!empty($_SERVER['HTTP_CLIENT_IP'])) : return $_SERVER['HTTP_CLIENT_IP']; 
     case (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) : return $_SERVER['HTTP_X_FORWARDED_FOR']; 
     default : return $_SERVER['REMOTE_ADDR']; 
    } 
} 

उपयोग कैसे करें:

$ip = getRealUserIp(); 
+11

यह एक स्विच स्टेटमेंट का एक बहुत ही अजीब और भ्रमित उपयोग है। http://www.codethinked.com/dont-be-clever –

+5

आप वास्तव में भ्रमित करने पर क्या विचार करते हैं? मेरे लिए, यह काफी स्पष्ट है! –

+1

यह भ्रमित है क्योंकि यह वही है यदि/elseif का उपयोग करने के लिए किया जाता है। – Andy

-1

यह विंडोज और लिनक्स के लिए काम करता है! इससे कोई फर्क नहीं पड़ता अगर यह स्थानीय होस्ट हो या ऑनलाइन ..

function getIP() { 
    $ip = $_SERVER['SERVER_ADDR']; 

    if (PHP_OS == 'WINNT'){ 
     $ip = getHostByName(getHostName()); 
    } 

    if (PHP_OS == 'Linux'){ 
     $command="/sbin/ifconfig"; 
     exec($command, $output); 
     // var_dump($output); 
     $pattern = '/inet addr:?([^ ]+)/'; 

     $ip = array(); 
     foreach ($output as $key => $subject) { 
      $result = preg_match_all($pattern, $subject, $subpattern); 
      if ($result == 1) { 
       if ($subpattern[1][0] != "127.0.0.1") 
       $ip = $subpattern[1][0]; 
      } 
     //var_dump($subpattern); 
     } 
    } 
    return $ip; 
} 
+0

यह हर बार काम नहीं करता है क्योंकि विन और लिनक्स से अधिक ओएस हैं। इसे चेक करें: http://stackoverflow.com/a/738893/2127296 –

+0

आप सही हैं, समाधान सिर्फ लिनक्स के लिए काम करता है और जीतता है। :) – Valcone

+7

यह सर्वर का आईपी पता देता है। आगंतुक नहीं है। प्रश्नकर्ता के आईपी पते के लिए सवाल पूछा गया। –

0
<?php 
function getrealip() 
{ 
if (isset($_SERVER)){ 
if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ 
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
if(strpos($ip,",")){ 
$exp_ip = explode(",",$ip); 
$ip = $exp_ip[0]; 
} 
}else if(isset($_SERVER["HTTP_CLIENT_IP"])){ 
$ip = $_SERVER["HTTP_CLIENT_IP"]; 
}else{ 
$ip = $_SERVER["REMOTE_ADDR"]; 
} 
}else{ 
if(getenv('HTTP_X_FORWARDED_FOR')){ 
$ip = getenv('HTTP_X_FORWARDED_FOR'); 
if(strpos($ip,",")){ 
$exp_ip=explode(",",$ip); 
$ip = $exp_ip[0]; 
} 
}else if(getenv('HTTP_CLIENT_IP')){ 
$ip = getenv('HTTP_CLIENT_IP'); 
}else { 
$ip = getenv('REMOTE_ADDR'); 
} 
} 
return $ip; 
} 


$MyipAddress = getrealip(); 
echo $MyipAddress; // IP: 58.97.178.57 
?> 

इस के लिए IPADDRESS मिल Output

4

इस कोड को लागू है:

if (getenv('HTTP_X_FORWARDED_FOR')) { $pipaddress = getenv('HTTP_X_FORWARDED_FOR'); 
$ipaddress = getenv('REMOTE_ADDR'); 
    echo "Your Proxy IP address is : ".$pipaddress. "(via $ipaddress)" ; } 
    else { $ipaddress = getenv('REMOTE_ADDR'); echo "Your IP address is : $ipaddress"; } 
    ------------------------------------------------------------------------ 
1

// समारोह पाने के लिए ग्राहक आईपी पता

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; 
 
}

See the detail Information

2

यह मेरा कार्य है।

लाभ:

  • कार्य करता है, तो $ _SERVER उपलब्ध नहीं था।
  • फ़िल्टर निजी और/या आरक्षित आईपी;
  • प्रक्रिया CloudFlare
  • साथ X_FORWARDED_FOR
  • संगत में सभी अग्रेषित आईपी एक डिफ़ॉल्ट सेट कर सकता हूँ अगर कोई मान्य IP मिल गया!
  • लघु & सरल!

/** 
* Get real user ip 
* 
* Usage sample: 
* GetRealUserIp(); 
* GetRealUserIp('ERROR',FILTER_FLAG_NO_RES_RANGE); 
* 
* @param string $default default return value if no valid ip found 
* @param int $filter_options filter options. default is FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE 
* 
* @return string real user ip 
*/ 

function GetRealUserIp($default = NULL, $filter_options = 12582912) { 
    $HTTP_X_FORWARDED_FOR = isset($_SERVER)? $_SERVER["HTTP_X_FORWARDED_FOR"]:getenv('HTTP_X_FORWARDED_FOR'); 
    $HTTP_CLIENT_IP = isset($_SERVER)?$_SERVER["HTTP_CLIENT_IP"]:getenv('HTTP_CLIENT_IP'); 
    $HTTP_CF_CONNECTING_IP = isset($_SERVER)?$_SERVER["HTTP_CF_CONNECTING_IP"]:getenv('HTTP_CF_CONNECTING_IP'); 
    $REMOTE_ADDR = isset($_SERVER)?$_SERVER["REMOTE_ADDR"]:getenv('REMOTE_ADDR'); 

    $all_ips = explode(",", "$HTTP_X_FORWARDED_FOR,$HTTP_CLIENT_IP,$HTTP_CF_CONNECTING_IP,$REMOTE_ADDR"); 
    foreach ($all_ips as $ip) { 
     if ($ip = filter_var($ip, FILTER_VALIDATE_IP, $filter_options)) 
      break; 
    } 
    return $ip?$ip:$default; 
} 
0

प्रॉक्सी जो तुम पर भरोसा है, तुम कोशिश कर सकते है: (मान लें प्रॉक्सी आईपी 151.101.2.10 है)

<?php 

$trustProxyIPs = ['151.101.2.10']; 

$clientIP = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL; 

if (in_array($clientIP, $trustProxyIPs)) { 

    $headers = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR']; 

    foreach ($headers as $key => $header) { 

     if (isset($_SERVER[$header]) && filter_var($_SERVER[$header], FILTER_VALIDATE_IP)) { 

      $clientIP = $_SERVER[$header]; 

      break; 
     } 
    } 
} 

echo $clientIP; 

यह सीधा अनुरोध किया ग्राहकों द्वारा हैडर आगे जाली कर पाएगा, और विश्वसनीय प्रॉक्सी के माध्यम से असली आईपी प्राप्त करें।