2009-12-15 13 views
45

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

string ipaddress = Request.UserHostAddress; 
+0

1. [http://www.w3schools.com/asp/coll_servervariables.asp](http://www .w3schools.com/asp/coll_servervariables.asp) 2. [http://balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/](http:// balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/) – solairaja

+1

संभावित डुप्लिकेट [ASP.NET में उपयोगकर्ता का क्लाइंट आईपी पता कैसे प्राप्त करें? ](http:/ /stackoverflow.com/questions/735350/how-to-get-a-users-client-ip-address-in-asp-net) –

उत्तर

54

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

public static String GetIP() 
{ 
    String ip = 
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrEmpty(ip)) 
    { 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 

    return ip; 
} 
+1

विभाजित HTTP_X_FORWARDED_FOR और अंतिम चयन करना बेहतर है- उत्तर देखें http://stackoverflow.com/a/13249280/52277 –

+2

'एक्स-फॉरवर्ड-फॉर 'में कई आईपी पते हो सकते हैं। – Gabriel

3

एक ग्राहक एक पारदर्शी गैर-अनाम प्रॉक्सी के माध्यम से कनेक्ट कर रहा है, तो आप से उनका पता प्राप्त कर सकते हैं:

Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 

जो अशक्त या "अज्ञात" लौटा सकते हैं या आईपी प्राप्त नहीं किया जा सकता है उस तरफ।

Request.ServerVariables["REMOTE_ADDR"]Request.UserHostAddress जैसा होना चाहिए, जिनमें से कोई भी गैर-अज्ञात प्रॉक्सी से नहीं है, तो इसका उपयोग किया जा सकता है।

हालांकि, अगर अनुरोध किसी अज्ञात प्रॉक्सी से आता है, तो क्लाइंट के आईपी को सीधे प्राप्त करना संभव नहीं है। यही कारण है कि वे उन प्रॉक्सी अज्ञात पर कॉल करते हैं।

34

HTTP_X_FORWARDED_FOR का उपयोग किया जाना चाहिए लेकिन यह एक अल्पविराम से अलग कई आईपी पते वापस कर सकता है। this page देखें।

तो आपको हमेशा इसे जांचना चाहिए। मैं व्यक्तिगत रूप से स्प्लिट फ़ंक्शन का उपयोग करता हूं।

public static String GetIPAddress() 
{ 
    String ip = 
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrEmpty(ip)) 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    else 
     ip = ip.Split(',')[0]; 

    return ip; 
} 
+17

मैं इसके साथ सावधान रहूंगा, आप पहली वस्तु चुन रहे हैं जो 1 9 2.168.x.x हो सकता है।आप आम तौर पर अंतिम प्राप्त करना चाहते हैं क्योंकि यह अंतिम प्रॉक्सी या क्लाइंट आपके सिस्टम से जुड़ रहा है (और शायद सबसे विश्वसनीय स्रोत)। देखें [विकिपीडिया लेख] (http://en.wikipedia.org/wiki/X- अग्रेषित- के लिए) कोड मैं इसका उपयोग करता हूं: 'ip = (HttpContext.Request.ServerVariables [" HTTP_X_FORWARDED_FOR "] ??" ") .प्लिट (',')। अंतिम()। ट्रिम(); ' –

+4

@ वाउटरसिमन्स, वही [विकिपीडिया लेख] के अनुसार (https://en.wikipedia.org/wiki/X-forwarded-for)" बाएं सबसे मूल क्लाइंट "है, इसलिए पहले() का उपयोग अंतिम() –

33

ऐसी स्थिति में जहां आप सुरक्षा के लिए आईपी पते का उपयोग करते हैं, आपको अपने बुनियादी ढांचे से अवगत होना चाहिए।

यदि आप अपने वेब सर्वर और हेडर सेट करने वाले अपने क्लाइंट के बीच प्रॉक्सी का उपयोग कर रहे हैं, तो आपको अंतिम पते पर भरोसा करने में सक्षम होना चाहिए। फिर आप आगे के हेडर से अंतिम आईपी पता प्राप्त करने के लिए अपडेट के साथ सुझाए गए मोहम्मद जैसे कोड का उपयोग करें (नीचे कोड देखें)

यदि आप प्रॉक्सी का उपयोग नहीं करते हैं, तो सावधान रहें कि एक्स-फॉरवर्डेड-हेडर हेडर बहुत है धोखा देने में आसान है। मेरा सुझाव है कि आप इसे तब अनदेखा करें जब तक आपके पास स्पष्ट कारण न हो कि क्यों नहीं।

public string GetIP(bool CheckForward = false) 
{ 
    string ip = null; 
    if (CheckForward) { 
     ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    } 

    if (string.IsNullOrEmpty(ip)) { 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } else { // Using X-Forwarded-For last address 
     ip = ip.Split(',') 
       .Last() 
       .Trim(); 
    } 

    return ip; 
} 

यह Wikipedia article अधिक अच्छी तरह से जोखिम बताते हैं:

मैं के रूप में आप का चयन करने के लिए अनुमति देने के इस प्रकार मोहम्मद अख्तर की कोड अपडेट किया गया।

0
string result = string.Empty; 
    string ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    if (!string.IsNullOrEmpty(ip)) 
    { 
     string[] ipRange = ip.Split(','); 
     int le = ipRange.Length - 1; 
     result = ipRange[0]; 
    } 
    else 
    { 
     result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 
+0

के बजाय किया जाना चाहिए कृपया अपने कोड में स्पष्टीकरण जोड़ें (और इंडेंटेशन में सुधार करें)। इससे आपके उत्तर की गुणवत्ता में सुधार होगा! –

+0

आप कभी भी 'le' चर का उपयोग नहीं कर रहे हैं - मुझे लगता है कि आप अगली पंक्ति में '0' के बजाय इसका उपयोग करना चाहते हैं –

4

MVC 6 में, आप आईपी पते इस तरह से पुनः प्राप्त:

HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString() 
संबंधित मुद्दे