2008-10-14 17 views
9

मैं आईपी पते पर आंकड़े एकत्र करता हूं जहां से उपयोगकर्ता मेरी साइट पर जाते हैं और मैंने देखा है कि केवल दो आईपी पते प्रस्तुत किए गए हैं, 172.16.16.1 और 172.16.16.248। आईपी ​​एड्रेस निर्धारित करने के लिए मैं जिस संपत्ति का उपयोग करता हूं वहUserHostAddress गलत आईपी देता है

Request.UserHostAddress 

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

उत्तर

9

यह एक रिवर्स प्रॉक्सी के काम की तरह दिखता है। जब आप एक रिवर्स प्रॉक्सी का उपयोग करते हैं, तो क्लाइंट प्रॉक्सी से जुड़ता है, जो आपके सर्वर पर एक नया कनेक्शन खोलता है। चूंकि ASP.NET उपयोगकर्ता पते को भरने के लिए आने वाले कनेक्शन के इन्फोस का उपयोग करता है, इसलिए आपको रिवर्स प्रॉक्सी का पता मिलता है।

यदि आप वास्तव में इस कॉन्फ़िगरेशन में हैं, तो आपको सही जानकारी प्राप्त करने के लिए रिवर्स प्रॉक्सी से सहायता की आवश्यकता होगी। अधिकांश रिवर्स प्रॉक्सी क्लाइंट के वास्तविक आईपी पते के साथ HTTP अनुरोध में हेडर जोड़ने की संभावना प्रदान करते हैं। अपने प्रॉक्सी के दस्तावेज की जांच करें।

1

मुझे लगता है कि आप एक नेट के पीछे हैं/रिवर्स प्रॉक्सी तो मुझे लगता है आप का उपयोग करने के लिए है:

Request.ServerVariables("REMOTE_ADDR") 

सबसे अधिक संभावना 172.16.0.0/12 अपने निजी लैन जहां 172.16.16.248 अपने स्वयं के पते और 172.16 है 16.1 आपके राउटर/प्रॉक्सी का पता।

+0

तुम्हारा मतलब फ्लॉप/16? – leppie

+0

नहीं,/12 डिफ़ॉल्ट के रूप में सही होना चाहिए। =) http: //en.wikipedia।संगठन/विकी/निजी_नेटवर्क – Node

0

आपके द्वारा सूचीबद्ध किए गए दो पते निजी होने के रूप में परिभाषित श्रेणियों में से एक हैं। (विवरण के लिए here देखें)

ऐसा लगता है जैसे आप अपने फ़ायरवॉल का आंतरिक पता उठा रहे हैं?

23

आप ऐसा कुछ करना चाहते हैं;

string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0]; 

HTTP_X_FORWARDED_FOR हैडर प्रॉक्सी सर्वर के पीछे आईपी पते हो जाता है।

इस पृष्ठ को देखें जो बताता है कि अधिक जानकारी में क्यों; Getting The Real IP of your Users

+0

मुझे HTTP_X_FORWARDED_FOR शीर्षलेख के बारे में पता है, लेकिन मुझे समस्या के कारणों में अधिक रुचि है। फिर भी धन्यवाद! –

+5

सावधान रहें कि जंजीर प्रॉक्सी कई HTTP_X_FORWARDED_FOR हेडर का कारण बन सकती है। –

+0

@Marc Climent: क्या आप इस प्रश्न का एक नया उत्तर जोड़ सकते हैं जिसके लिए खाता है? मैं देखना चाहता हूं कि यह कैसे काम करता है। अनुरोध होगा। सर्वरवृत्त ["HTTP_X_FORWARDED_FOR"] 'आईपी की एक सीमित स्ट्रिंग वापस करें, या यह सिर्फ पहले/अंतिम शीर्षलेख को वापस करेगा? – MikeWyatt

1

Request.ServerVariables ("REMOTE_ADDR") काम नहीं कर रहा है। यह समस्या इसलिए है क्योंकि आपका सर्वर शायद कुछ प्रॉक्सी के पीछे है। (या कुछ नेटवर्क के माध्यम से इंटरनेट से कनेक्ट) या आपकी राउटर सेटिंग्स को एनएटी (नेटवर्क एड्रेस ट्रांसलेशन) के रूप में सेट किया गया है, यह तकनीक आईपी को सर्वर से पास नहीं करती है। ऐसी परिस्थितियों में आपको Asp.net का उपयोग करके आईपी पता नहीं मिल सकता है, हालांकि जावा एप्लेट प्रदान करता है जिसका उपयोग आप किसी भी मामले में आईपी पता प्राप्त कर सकते हैं।

(नेटस्केप, मोज़िला और Firefox केवल, और जावा के लिए सक्षम होना चाहिए)

<script language="javascript" type="text/javascript"> 

if (navigator.appName.indexOf("Netscape") != -1){ 
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress(); 
document.write("<b>Your IP address is " + ip+'</b>'); 
} 
else { 
document.write("<b>IP Address only shown in Netscape with Java enabled!</b>"); 
} 

</script> 
5

डेव एंडरसन की जवाब पर बिल्डिंग, यहाँ एक टुकड़ा है कि खाते में रिवर्स प्रॉक्सी की एक श्रृंखला लेता है।

string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
        ? Request.ServerVariables["REMOTE_ADDR"] 
        : forwardedFor.Split(',').Select(s => s.Trim()).First(); 
0

बिल्डिंग पर tomfannings का जवाब ...

public static string ClientIp(this HttpRequestBase @this) { 
    var clientIp = string.Empty; 
    string forwardedFor = @this.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrWhiteSpace(forwardedFor)) { 
    clientIp = @this.ServerVariables["REMOTE_ADDR"]; 
    } else { 

    var array = forwardedFor 
     .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
     .Select(s => s.Trim()); 

    foreach (var element in array) { 
     if (element.IsValidIp4() || element.IsValidIp6()) { 
     clientIp = element; 
     break; 
     } 
    } 
    } 
    return clientIp; 
} 

public static bool IsValidIp4(this string @this) { 
    var pattern = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$"); 
    return pattern.IsMatch(@this); 
} 

public static bool IsValidIp6(this string @this) { 
    var pattern = new Regex(@"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(d|dd|1[0-1]d|12[0-8]))$"); 
    return pattern.IsMatch(@this); 
} 
+0

पूछे गए प्रश्न के संबंध में अपना कोड समझाएगा। – Prateek

संबंधित मुद्दे