Domanda

Raccolgo statistiche sugli indirizzi IP da cui gli utenti visitano il mio sito e ho notato che ci sono solo due indirizzi IP presentati, 172.16.16.1 e 172.16.16.248. La proprietà che utilizzo per determinare l'indirizzo IP è

Request.UserHostAddress

Quale potrebbe essere una ragione per la perdita di informazioni sull'indirizzo IP? Tutti gli utenti provengono da tutto il mondo, quindi non possono essere dietro solo due proxy.

È stato utile?

Soluzione

Sembra il lavoro di un proxy inverso. Quando si utilizza un proxy inverso, il client si connette al proxy, che a sua volta apre una nuova connessione al server. Poiché ASP.NET utilizza le informazioni della connessione in entrata per riempire l'indirizzo dell'utente, si ottiene l'indirizzo del proxy inverso.

Se sei effettivamente in questa configurazione, avrai bisogno dell'aiuto del proxy inverso per ottenere le giuste informazioni. La maggior parte dei proxy inversi offre la possibilità di aggiungere un'intestazione alla richiesta HTTP, con l'indirizzo IP reale del client. Controlla la documentazione del tuo proxy.

Altri suggerimenti

Potresti voler qualcosa del genere;

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

L'intestazione HTTP_X_FORWARDED_FOR ottiene l'indirizzo IP dietro i server proxy.

Vedi questa pagina che spiega perché in modo più dettagliato; Ottenere il vero IP dei tuoi utenti

Sulla base della risposta di Dave Anderson, ecco uno snippet che tiene conto di una catena di proxy inversi.

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

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

Suppongo che tu sia dietro un proxy NAT / Reverse, quindi penso che devi usare:

Request.ServerVariables("REMOTE_ADDR") 

Molto probabilmente 172.16.0.0/12 è la tua LAN privata dove 172.16.16.248 è il tuo indirizzo e 172.16.16.1 l'indirizzo del tuo router / proxy.

Request.ServerVariables (" REMOTE_ADDR ") non funziona. questo problema è dovuto al fatto che il tuo server è probabilmente dietro un proxy (o connesso a Internet tramite una rete) o che le impostazioni del tuo router sono impostate come NAT (Network Address Translation) questa tecnica non passa l'ip al server. in tali situazioni non è possibile ottenere l'indirizzo IP utilizzando Asp.net tuttavia Java Fornisce l'applet con la quale è possibile ottenere l'indirizzo IP in ogni caso.

(solo per Netscape, Mozilla e Firefox e Java deve essere abilitato)

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

I due indirizzi che hai elencato provengono da uno degli intervalli definiti come privati. (vedi qui per la descrizione)

Sembra più che tu stia raccogliendo l'indirizzo interno dei tuoi firewall?

Basandosi sulla risposta di 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]))<*>quot;);
  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]))<*>quot;);
  return pattern.IsMatch(@this);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top