2011-10-01 12 views
7

मेरे पास एक साधारण स्क्रिप्ट है जो उपयोगकर्ता का आईपी पता निर्धारित करती है:

function GetIp(){ 
     if (!empty($_SERVER['HTTP_CLIENT_IP'])) 
     //check ip from share internet 
     { 
     $ip=$_SERVER['HTTP_CLIENT_IP']; 
     } 
     elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) 
     //to check ip is pass from proxy 
     { 
     $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
     } 
     else 
     { 
     $ip=$_SERVER['REMOTE_ADDR']; 
     } 
     return $ip; 
} 

अब नेट पर मैंने किसी को इस स्क्रिप्ट का उपयोग करके देखा:

if (isset($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP'] != '') 
     $Ip = $_SERVER['HTTP_CLIENT_IP']; 
    elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '') 
     $Ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] != '') 
     $Ip = $_SERVER['REMOTE_ADDR']; 

मैं सोच रहा था कि मेरा कार्यान्वयन टूट गया है .. क्या करें मुझे यह जांचना होगा कि $_SERVER['HTTP_CLIENT_IP'], $_SERVER['HTTP_X_FORWARDED_FOR'], या $_SERVER['REMOTE_ADDR'] का मान खाली है या नहीं? या यह वास्तव में ऐसा करने के लिए अनावश्यक है?

+1

इसका उद्देश्य क्या है? क्या यह किसी भी तरह से सुरक्षा के लिए प्रासंगिक है? बीकॉज़ अगर यह है, 'REMOTE_ADDR' केवल एक सार्थक है। –

+0

निर्भर करता है। मुझे याद है कि कुछ होस्टिंग कंपनियां वहां मौजूद हैं जिनके पास उनके सर्वर के सामने प्रॉक्सी है और वे प्रॉक्सी * स्थानीय * आईपी में धक्का देते हैं जो 'REMOTE_ADDR' हमेशा '10.0.0.1' जैसा होता है ... तो यदि आप चाहते थे क्लाइंट आईपी प्राप्त करें जिसे आपको 'X_FORWARDED_FOR' – klaustopher

उत्तर

12

यदि आप क्लाइंट के आईपी पते को जानना चाहते हैं तो वास्तव में महत्वपूर्ण है, इन सभी चीजों को पेंच करें।

इन हैडर मूल्यों में से कोई एक स्वतंत्र रूप से जाली जा सकता है। के रूप में यह अपने वेब सर्वर है कि अनुरोध पर कार्य कर रहा है द्वारा फैलता है

REMOTE_ADDR, केवल वास्तव में विश्वसनीय जानकारी है। यह सैद्धांतिक रूप से falsified as well हो सकता है, लेकिन यह हेडर वैल्यू को धोखा देने और हमले की एक पूरी तरह से अलग वर्ग की तुलना में बहुत कठिन है।

रिवर्स प्रॉक्सी के पीछे बहुत ही विशिष्ट होस्टिंग वातावरण में अपवाद हैं। उन मामलों में वह प्रॉक्सी प्रशासित करने वाला व्यक्ति यह बताने में सक्षम होगा कि आपको किस हेडर वैल्यू के लिए परीक्षण करने की आवश्यकता है।

+0

क्या आप "स्वतंत्र रूप से धोखेबाज" शब्दों पर विस्तृत जानकारी दे सकते हैं .. क्या आपका मतलब है कि मेरे जैसे एक आम आदमी इस तरह की लिपि का उपयोग करने वाली वेबसाइट को धोखा दे सकता है? – Pacerier

+0

@Pacerier yup - इसका मतलब है कि जब मैं आपकी वेबसाइट पर अनुरोध करता हूं, तो मैं किसी भी मान के साथ 'X_HTTP_FORWARDED_FOR' शीर्षलेख के साथ भेज सकता हूं (उदा। किसी और का आईपी पता)। कर्ल या ब्राउज़र प्लगइन का उपयोग करके यह आसानी से करने योग्य है। एक सामान्य सेटअप में, 'REMOTE_ADDR' एकमात्र विश्वसनीय आईपी पता है। @ केमो का स्निपेट केवल हेडर मानों पर भरोसा करके विचार करता है जब वे एक विश्वसनीय प्रॉक्सी –

+0

से जानकारी के लिए धन्यवाद! और ये लोग यहां http://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-php कार्यों को नामित कर रहे हैं ** GetRealRemoteIp ** जैसे कि यह $ _SERVER करने की तुलना में * मजबूत * है [ "REMOTE_ADDR"] – Pacerier

1

दो चीजें व्यावहारिक रूप से समान हैं .. आपको मिली स्क्रिप्ट में, लेखक सिर्फ यह जांच कर रहा है कि सरणी में तत्व यह जांचने से पहले सेट किया गया है कि यह खाली नहीं है।

तुलना के बजाय empty() -function का उपयोग करने के संबंध में, http://php.net/empty देखें। चूंकि आप एक चर के साथ काम कर रहे हैं जो पर्यावरण द्वारा निर्धारित है और उपयोगकर्ता इनपुट नहीं है, इससे कोई फ़र्क नहीं पड़ता कि आप कौन से दो विकल्प चुनते हैं। तो अपनी स्क्रिप्ट Kohanas 'अनुरोध वर्ग से बिल्कुल ठीक

+0

के साथ जाना था, मेरा मतलब है कि मुझे पता है कि यह एक खाली चेक कर रहा है, मुझे आश्चर्य है कि ऐसा करना आवश्यक है या नहीं। दूसरे शब्दों में .. क्या मुझे कभी भी परिणाम मिलेगा जो शून्य-लंबाई है? – Pacerier

8

होना चाहिए:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
    AND isset($_SERVER['REMOTE_ADDR']) 
    AND in_array($_SERVER['REMOTE_ADDR'], Request::$trusted_proxies)) 
{ 
    // Use the forwarded IP address, typically set when the 
    // client is using a proxy server. 
    // Format: "X-Forwarded-For: client1, proxy1, proxy2" 
    $client_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 

    Request::$client_ip = array_shift($client_ips); 

    unset($client_ips); 
} 
elseif (isset($_SERVER['HTTP_CLIENT_IP']) 
    AND isset($_SERVER['REMOTE_ADDR']) 
    AND in_array($_SERVER['REMOTE_ADDR'], Request::$trusted_proxies)) 
{ 
    // Use the forwarded IP address, typically set when the 
    // client is using a proxy server. 
    $client_ips = explode(',', $_SERVER['HTTP_CLIENT_IP']); 

    Request::$client_ip = array_shift($client_ips); 

    unset($client_ips); 
} 
elseif (isset($_SERVER['REMOTE_ADDR'])) 
{ 
    // The remote IP address 
    Request::$client_ip = $_SERVER['REMOTE_ADDR']; 
} 

यह काफी के रूप में के रूप में यह हो जाता है अच्छा है। कृपया Request::$trusted_proxies सरणी नोट करें और इस मामले में आपका $ip var Request::$client_ip है।

7

क्लाइंट आईपी के लिए HTTP_* शीर्षलेखों की जांच न करें जबतक कि आप विशेष रूप से नहीं जानते कि आपका एप्लिकेशन रिवर्स प्रॉक्सी के पीछे कॉन्फ़िगर किया गया है। बिना शर्त रूप से इन शीर्षकों के मूल्यों पर भरोसा करने से उपयोगकर्ताओं को उनके आईपी पते को खराब करने की अनुमति मिल जाएगी।

एक विश्वसनीय मूल्य वाला केवल $_SERVER फ़ील्ड REMOTE_ADDR है।

+0

आईसी .. मुझे वास्तव में यहां स्क्रिप्ट मिल जाएगी http://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-php क्या आप समझा सकते हैं कि हर कोई इस प्रकार की आईपी पहचान स्क्रिप्ट का उपयोग क्यों कर रहा है और डालने यह * GetRealIp * नामक फ़ंक्शन में * वास्तविक आईपी * $ _SERVER ["REMOTE_ADDR"] में संग्रहीत है? – Pacerier

+1

क्योंकि वे असुरक्षित कोड लिख रहे हैं। टिप्पणियां देखें! – duskwuff