406 votes

Comment obtenir l'adresse IP du client d'un utilisateur en ASP.NET ?

Nous avons Request.UserHostAddress pour obtenir l'adresse IP en ASP.NET, mais il s'agit généralement de l'adresse IP du FAI de l'utilisateur, et non de l'adresse IP exacte de la machine de l'utilisateur qui a par exemple cliqué sur un lien. Comment puis-je obtenir la véritable adresse IP ?

Par exemple, dans un profil d'utilisateur de Stack Overflow, c'est : "Dernière activité du compte : il y a 4 heures depuis 86.123.127.8" mais l'adresse IP de ma machine est un peu différente. Comment Stack Overflow obtient-il cette adresse ?

Dans certains systèmes Web, l'adresse IP est vérifiée à certaines fins. Par exemple, avec une certaine adresse IP, l'utilisateur peut-il, toutes les 24 heures, n'avoir que 5 clics sur des liens de téléchargement ? Cette adresse IP doit être unique, pas pour un FAI qui a un grand nombre de clients ou d'internautes.

Ai-je bien compris ?

4 votes

Ils font généralement la même chose et ne fonctionnent pas correctement pour les adresses IP partagées. Il n'y a pas grand-chose à faire dans ce domaine.

0 votes

Quel est le problème que vous essayez de résoudre ici, pourquoi pensez-vous avoir besoin de l'adresse IP ?

3 votes

J'ai une application qui vérifie les clics sur un lien spécifique, et un utilisateur spécifique (par IP) ne peut pas cliquer sur le lien plus de 5 fois dans une journée. Le problème est que si Request.UserHostAddress est pour une gamme d'utilisateurs sous un ISP ou un réseau ou un utilisateur spécifique ?

469voto

mangokun Points 1680

Vous voudrez souvent connaître l'adresse IP d'une personne qui visite votre site web. Bien qu'ASP.NET dispose de plusieurs moyens de le faire, l'un des meilleurs que nous ayons vu est l'utilisation de "HTTP_X_FORWARDED_FOR" de la collection ServerVariables.

Voici pourquoi...

Il arrive que vos visiteurs se trouvent derrière un serveur proxy ou un routeur et que la norme Request.UserHostAddress ne saisit que l'adresse IP du serveur proxy ou du routeur. Lorsque c'est le cas, l'adresse IP de l'utilisateur est alors stockée dans la variable du serveur ("HTTP_X_FORWARDED_FOR").

Donc ce que nous voulons faire, c'est d'abord vérifier "HTTP_X_FORWARDED_FOR" et si c'est vide, nous retournons simplement ServerVariables("REMOTE_ADDR") .

Bien que cette méthode ne soit pas infaillible, elle peut conduire à de meilleurs résultats. Vous trouverez ci-dessous le code ASP.NET en VB.NET, tiré de James Crowley's blog post "Gotcha : HTTP_X_FORWARDED_FOR returns multiple IP addresses" (en anglais)

C#

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current; 
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function

3 votes

@deepeshk L'exécutez-vous localement dans IIS ?

2 votes

HTTP_X_FORWARDED_FOR doit être facile à falsifier car je l'ai testé sur les 5 premiers serveurs proxy gratuits que j'ai trouvés et il est toujours nul, donc renvoie l'IP du serveur proxy :(

28 votes

Veillez à ne pas utiliser ce code à des fins de sécurité, car n'importe qui peut falsifier les en-têtes HTTP_X_FORWARDED_FOR ou des en-têtes similaires. Ainsi, si vous utilisez ce code pour la journalisation ou les contrôles de sécurité, un attaquant peut facilement le contourner.

146voto

Steve Haigh Points 6261

Comme d'autres l'ont dit, vous ne pouvez pas faire ce que vous demandez. Si vous décrivez le problème que vous essayez de résoudre, peut-être quelqu'un pourra-t-il vous aider ?

Par exemple

  • Essayez-vous d'identifier vos utilisateurs de manière unique ?
  • Pourriez-vous utiliser un cookie, ou l'identifiant de session, au lieu de l'adresse IP ?

Editar L'adresse que vous voyez sur le serveur ne devrait pas être l'adresse du fournisseur d'accès à Internet, car comme vous l'avez dit, il s'agirait d'un vaste éventail. L'adresse d'un utilisateur domestique en haut débit sera l'adresse de son routeur, de sorte que chaque appareil à l'intérieur de la maison semblera être le même à l'extérieur, mais le routeur utilise le NAT pour s'assurer que le trafic est acheminé correctement vers chaque appareil. Pour les utilisateurs accédant depuis un environnement de bureau, l'adresse peut être la même pour tous les utilisateurs. Les sites qui utilisent l'adresse IP pour l'identification courent le risque de se tromper - les exemples que vous donnez sont bons et ils échouent souvent. Par exemple, mon bureau se trouve au Royaume-Uni, mais le point d'accès (où j'ai l'impression d'être sur Internet) se trouve dans un autre pays, là où se trouve notre principale installation informatique, de sorte que depuis mon bureau, mon adresse IP semble ne pas se trouver au Royaume-Uni. C'est la raison pour laquelle je ne peux pas accéder à des contenus Web exclusivement britanniques, tels que le iPlayer de la BBC.) À tout moment, des centaines, voire des milliers de personnes de mon entreprise semblent accéder au web à partir de la même adresse IP.

Lorsque vous écrivez du code serveur, vous ne pouvez jamais être sûr de l'adresse IP que vous voyez. Certains utilisateurs apprécient cette situation. D'autres utilisent délibérément un proxy ou un VPN pour vous déconcerter davantage.

Lorsque vous dites que l'adresse de votre machine est différente de l'adresse IP indiquée sur StackOverflow, comment trouvez-vous l'adresse de votre machine ? Si vous effectuez une recherche locale en utilisant ipconfig ou quelque chose comme ça, je m'attendrais à ce que ce soit différent pour les raisons que j'ai décrites ci-dessus. Si vous voulez vérifier ce que le monde extérieur pense, jetez un coup d'œil à whatismyipaddress.com/ .

Ce site Lien Wikipedia sur le NAT vous fournira quelques informations à ce sujet.

0 votes

J'ai donc compris que dans les applications côté serveur, nous ne pouvons pas être sûrs de l'adresse IP. Cela signifie que la programmation côté client est la solution ? vous voulez dire par exemple qu'avec quelques codes JavaScript, nous pouvons le faire ? ?

13 votes

NON, cela ne servirait à rien, l'adresse IP que le client "pense" avoir sera interne à la maison ou au bureau, elle n'aura aucune signification dans le monde extérieur. Par exemple, la plupart des routeurs domestiques distribuent des adresses IP dans la plage 192.168.1.xxx, de sorte que des milliers de machines ont la même adresse sur leur propre réseau.

0 votes

Mais c'est une nouvelle question : si le résultat de Request.UserHostAddress est unique pour chaque utilisateur ou non ? mon objectif est de savoir combien de fois un utilisateur clique sur un lien par adresse IP, Request.UserHostAddress peut le faire ? ici, l'IP n'a pas d'importance si elle est correcte ou non ; le défi est d'atteindre une IP unique pour chaque utilisateur.

86voto

algreat Points 2494

UPDATE : Merci à Bruno Lopes. Si plusieurs adresses ip peuvent venir alors il faut utiliser cette méthode :

    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }

4 votes

Comme indiqué dans une autre réponse, HTTP_X_FORWARDED_FOR peut être une liste d'IP, séparées par des virgules.

0 votes

En réponse à la fonction, je n'obtiens que ::1 à chaque fois. Je ne peux pas obtenir l'adresse IP complète ???

2 votes

Il retournera ::1 sur l'hôte local. essayez-le sur l'environnement productino et tout devrait bien se passer.

26voto

Si c'est c# voir de cette façon, est très simple

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();

8 votes

Si les deux variables du serveur sont nulles, une exception peut être levée.

0 votes

Qu'est-ce que la demande de référencement ici ? I ServerVariables introuvables

24voto

Mehrdad Afshari Points 204872

Que considérez-vous comme l'adresse IP de l'utilisateur ? Si vous voulez l'adresse IP de la carte réseau, je crains qu'il n'y ait aucun moyen de le faire dans une application Web. Si votre utilisateur est derrière un NAT ou autre, vous ne pouvez pas non plus obtenir l'IP.

Mise à jour : Bien qu'il existe des sites Web qui utilisent l'IP pour limiter l'utilisateur (comme rapidshare), ils ne fonctionnent pas correctement dans les environnements NAT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X