Question

Je collecte des statistiques sur les adresses IP à partir desquelles les utilisateurs visitent mon site et j'ai constaté que seules deux adresses IP étaient présentées, à savoir 172.16.16.1 et 172.16.16.248. La propriété que j'utilise pour déterminer l'adresse IP est

Request.UserHostAddress

Quelle pourrait être la raison de la perte d'informations d'adresse IP? Tous les utilisateurs viennent du monde entier. Ils ne peuvent donc pas se contenter de deux mandataires.

Était-ce utile?

La solution

Cela ressemble au travail d’un proxy inverse. Lorsque vous utilisez un proxy inverse, le client se connecte au proxy, qui lui-même ouvre une nouvelle connexion à votre serveur. Comme ASP.NET utilise les informations de la connexion entrante pour renseigner l'adresse de l'utilisateur, vous obtenez l'adresse du proxy inverse.

Si vous êtes bien dans cette configuration, vous aurez besoin de l'aide du proxy inverse pour obtenir les bonnes informations. La plupart des proxys inversés offrent la possibilité d'ajouter un en-tête à la requête HTTP, avec l'adresse IP réelle du client. Consultez la documentation de votre proxy.

Autres conseils

Vous voudrez peut-être quelque chose comme ceci;

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

L'en-tête HTTP_X_FORWARDED_FOR obtient l'adresse IP derrière les serveurs proxy.

Voir cette page qui explique pourquoi plus en détail; Obtenir la véritable adresse IP de vos utilisateurs

Sur la base de la réponse de Dave Anderson, voici un extrait qui prend en compte une chaîne de proxys inverses.

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

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

Je suppose que vous êtes derrière un proxy NAT / inverse, donc je pense que vous devez utiliser:

Request.ServerVariables("REMOTE_ADDR") 

172.16.0.0/12 est probablement votre réseau local privé, où 172.16.16.248 est votre propre adresse et 172.16.16.1 l'adresse de votre routeur / proxy.

Request.ServerVariables ("REMOTE_ADDR") ne fonctionne pas. ce problème est dû au fait que votre serveur est probablement derrière un proxy (ou connecté à Internet via un réseau) ou que les paramètres de votre routeur sont définis en tant que NAT (traduction d’adresses réseau), cette technique ne permet pas de passer ip au serveur. dans de telles situations, vous ne pouvez pas obtenir d'adresse IP avec Asp.net Cependant, Java fournit une applet à l'aide de laquelle vous pouvez obtenir une adresse IP dans tous les cas.

(pour Netscape, Mozilla et Firefox uniquement, et Java doit être activé)

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

Les deux adresses que vous avez répertoriées appartiennent à l’une des plages définies comme étant privées. (voir ici pour obtenir une description)

On dirait plus que vous prenez l'adresse interne de votre propre pare-feu?

S'appuyant sur les réponses de demain ...

 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top