سؤال

وأقوم بجمع إحصاءات عن عناوين IP من حيث يزورها المستخدمون على موقعي ولقد لاحظت ما يوجد سوى اثنين من عناوين IP المقدمة، 172.16.16.1 و172.16.16.248. الخاصية التي يمكنني استخدامها لتحديد عنوان IP هو

Request.UserHostAddress

وماذا يمكن أن يكون سببا للمعلومات عنوان IP الخاسر؟ جميع المستخدمين من جميع أنحاء العالم، حتى أنها cann't تكون وراء وكلاء اثنين فقط.

هل كانت مفيدة؟

المحلول

وهذا يبدو وكأنه عمل وكيل عكسي. عند استخدام وكيل عكسي، يتصل العميل إلى الوكيل، والذي في حد ذاته يفتح اتصال جديد على الخادم الخاص بك. منذ ASP.NET يستخدم بقية المقال للاتصال وارد لملء العنوان المستخدم، يمكنك الحصول على عنوان وكيل عكسي.

إذا كنت حقا في هذا التكوين، ستحتاج مساعدة من وكيل عكسي للحصول على المعلومات الصحيحة. معظم وكلاء عكسي توفر إمكانية إضافة رأس لطلب HTTP، مع عنوان IP الحقيقي للعميل. تحقق من وثائق الوكيل.

نصائح أخرى

وقد تحتاج إلى شيء من هذا القبيل؛

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 يحصل على عنوان IP وراء خوادم بروكسي.

وانظر هذه الصفحة التي تشرح سبب في مزيد من التفاصيل. الحصول ريال مدريد IP المستخدمين المرور

وبناء على الجواب ديف أندرسون، وهنا مقتطف التي تأخذ في الاعتبار سلسلة من الوكلاء عكسي.

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

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

وأفترض كنت خلف NAT / عكسي وكيل لذلك أعتقد أن لديك لاستخدام:

Request.ServerVariables("REMOTE_ADDR") 

وعلى الأرجح 172.16.0.0/12 هو بريفا بك LAN حيث 172.16.16.248 هو عنوان خاص بك و172.16.16.1 عنوان جهاز التوجيه / الوكيل.

وRequest.ServerVariables ( "REMOTE_ADDR") لا يعمل. هذه المشكلة لأن الخادم اور هو على الارجح وراء بعض الوكيل. (أو متصلا بالإنترنت عبر بعض شبكة) أو يتم تعيين إعدادات جهاز التوجيه الخاص بك كما NAT (ترجمة عنوان الشبكة) هذه التقنية] لا يمر الملكية الفكرية إلى الخادم. في مثل هذه الحالات ش لا يمكن الحصول على عنوان IP باستخدام Asp.net لكن جافا تقديم برنامج صغير باستخدام والتي ش يمكن الحصول على عنوان IP في أي حال.

و(لليجب تفعيل نيتسكيب، موزيلا فايرفوكس وفقط، وجافا)

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

وعناوين اثنين كنت المدرجة هناك من أحد النطاقات المحددة على أنها سرية. (انظر هنا لوصف)

ويبدو أكثر وكأنك التقاط عنوان داخلي جدار الحماية الخاص بك (ق)؟

وبناء على 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top