430 Stimmen

Wie bekomme ich die Client-IP-Adresse eines Benutzers in ASP.NET?

Wir haben Request.UserHostAddress, um die IP-Adresse in ASP.NET zu bekommen, aber dies ist normalerweise die IP-Adresse des Internetanbieters des Benutzers, nicht genau die IP-Adresse des Benutzers auf dem Gerät, der zum Beispiel auf einen Link geklickt hat. Wie kann ich die echte IP-Adresse bekommen?

Zum Beispiel steht in einem Stack Overflow-Benutzerprofil: "Letzte Kontoaktivität: Vor 4 Stunden von 86.123.127.8", aber meine Geräte-IP-Adresse ist etwas anders. Wie kommt Stack Overflow an diese Adresse?

In einigen Web-Systemen gibt es eine IP-Adressprüfung für bestimmte Zwecke. Zum Beispiel kann mit einer bestimmten IP-Adresse ein Benutzer alle 24 Stunden nur 5 Klicks auf Download-Links haben. Diese IP-Adresse sollte eindeutig sein, nicht für einen Internetanbieter, der eine große Anzahl von Kunden oder Internetnutzern hat.

Habe ich das richtig verstanden?

4 Stimmen

Sie tun in der Regel dasselbe und funktionieren nicht korrekt für gemeinsam genutzte IP-Adressen. In diesem Bereich kann nicht viel getan werden.

0 Stimmen

Was ist das Problem, das Sie hier lösen möchten, warum glauben Sie, dass Sie die IP-Adresse benötigen?

4 Stimmen

Ich habe eine Anwendung, die spezifische Link-Klicks überprüft, und ein spezifischer Benutzer (nach IP) kann den Link an einem Tag nicht mehr als 5 Mal klicken. Das Problem ist, ob Request.UserHostAddress für eine Gruppe von Benutzern unter einem ISP oder Netzwerk oder für einen bestimmten Benutzer ist.

501voto

mangokun Punkte 5393

Oft möchten Sie die IP-Adresse einer Person wissen, die Ihre Website besucht. Während ASP.NET mehrere Möglichkeiten dafür bietet, ist eine der besten Möglichkeiten, die wir gesehen haben, die Verwendung von "HTTP_X_FORWARDED_FOR" der ServerVariables-Sammlung.

Hier ist der Grund...

Manchmal befinden sich Ihre Besucher entweder hinter einem Proxyserver oder einem Router, und die Standard Request.UserHostAddress erfasst nur die IP-Adresse des Proxy-Servers oder Routers. Wenn das der Fall ist, wird die IP-Adresse des Benutzers in der Servervariable ("HTTP_X_FORWARDED_FOR") gespeichert.

Was wir also tun wollen, ist zuerst "HTTP_X_FORWARDED_FOR" überprüfen und wenn das leer ist, geben wir einfach ServerVariables("REMOTE_ADDR") zurück.

Obwohl diese Methode nicht narrensicher ist, kann sie zu besseren Ergebnissen führen. Unten ist der ASP.NET-Code in VB.NET, entnommen aus James Crowleys Blog-Beitrag "Gotcha: HTTP_X_FORWARDED_FOR gibt mehrere IP-Adressen zurück"

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 Stimmen

@deepeshk Führen Sie es lokal in IIS aus?

2 Stimmen

HTTP_X_FORWARDED_FOR muss einfach zu fälschen sein, weil ich dies auf den ersten 5 kostenlosen Proxy-Servern getestet habe, die ich gefunden habe, und es ist immer null, daher gibt es immer die IP der Proxy-Server zurück :(

39 Stimmen

Stellen Sie sicher, dass Sie diesen Code aus Sicherheitsgründen nicht verwenden, da jeder HTTP_X_FORWARDED_FOR oder ähnliche Header fälschen kann. Wenn Sie dies für sicherheitsrelevante Protokollierung oder Sicherheitsprüfungen verwenden, kann ein Angreifer es leicht umgehen.

148voto

Steve Punkte 8371

Wie bereits von anderen erwähnt, können Sie nicht tun, was Sie fragen. Wenn Sie das Problem beschreiben, das Sie lösen möchten, kann Ihnen vielleicht jemand helfen?

Zum Beispiel:

  • Versuchen Sie, Ihre Benutzer eindeutig zu identifizieren?
  • Könnten Sie stattdessen ein Cookie oder die Sitzungs-ID anstelle der IP-Adresse verwenden?

Bearbeiten Die Adresse, die Sie auf dem Server sehen, sollte nicht die Adresse des ISPs sein, wie Sie sagen, das wäre ein großer Bereich. Die Adresse für einen Heimanwender im Breitbandnetz ist die Adresse an ihrem Router, so dass jedes Gerät im Haus nach außen hin gleich erscheint, aber der Router verwendet NAT, um sicherzustellen, dass der Datenverkehr korrekt an jedes Gerät weitergeleitet wird. Für Benutzer, die aus einer Büroumgebung zugreifen, könnte die Adresse für alle Benutzer gleich sein. Websites, die die IP-Adresse zur Identifikation verwenden, laufen Gefahr, damit komplett falsch zu liegen - die von Ihnen genannten Beispiele sind gute Beispiele und sie scheitern oft. Beispielsweise ist mein Büro im Vereinigten Königreich, der Verbindungspunkt (wo ich "im Internet erscheine") ist in einem anderen Land, wo unser Haupt-IT-Einrichtung ist, also erscheint meine IP-Adresse von meinem Büro aus nicht im Vereinigten Königreich. Aus diesem Grund habe ich keinen Zugriff auf Inhalte, die nur im Vereinigten Königreich verfügbar sind, wie z.B. den BBC iPlayer). Zu jedem Zeitpunkt würden Hunderte oder sogar Tausende von Personen in meinem Unternehmen erscheinen, als würden sie von derselben IP-Adresse aus auf das Internet zugreifen.

Wenn Sie Servercode schreiben, können Sie nie sicher sein, auf welche IP-Adresse sich die Informationen beziehen, die Sie sehen. Einige Benutzer mögen es auf diese Weise. Manche Leute verwenden absichtlich einen Proxy oder VPN, um Sie weiterhin zu verwirren.

Wenn Sie sagen, dass Ihre Maschinenadresse sich von der auf StackOverflow angezeigten IP-Adresse unterscheidet, wie finden Sie Ihre Maschinenadresse heraus? Wenn Sie nur lokal mit ipconfig oder ähnlichem suchen, würde ich erwarten, dass sie aufgrund der oben genannten Gründe unterschiedlich ist. Wenn Sie überprüfen möchten, was die äußere Welt denkt, sehen Sie sich whatismyipaddress.com/ an.

Dieser Wikipedia-Link zu NAT bietet Ihnen einige Hintergrundinformationen dazu.

0 Stimmen

Also habe ich verstanden, dass wir uns in serverseitigen Anwendungen nicht auf die IP-Adresse verlassen können. Bedeutet das, dass die Lösung in der clientseitigen Programmierung liegt? Du meinst zum Beispiel, dass wir das mit einigen JavaScript-Codes machen können??

13 Stimmen

NEIN, das wäre sinnlos, die IP-Adresse, die der Client "denkt", dass er hat, wird intern im Heim oder im Büro sein, sie wird in der Außenwelt bedeutungslos sein. Z.B. vergeben die meisten Heimrouter IP-Adressen im Bereich 192.168.1.xxx, so dass Tausende von Geräten die gleiche Adresse in ihren eigenen Netzwerken haben.

0 Stimmen

Aber dies ist eine neue Frage: ist das Ergebnis von Request.UserHostAddress für jeden Benutzer eindeutig oder nicht? Mein Ziel ist es herauszufinden, wie oft ein Benutzer auf einen Link klickt, indem ich die IP-Adresse verwende. Kann Request.UserHostAddress das leisten? Hier ist es nicht wichtig, ob die IP korrekt ist oder nicht, die Herausforderung besteht darin, eine eindeutige IP für jeden Benutzer zu erreichen.

90voto

algreat Punkte 8112

UPDATE: Dank an Bruno Lopes. Wenn mehrere IP-Adressen kommen könnten, muss diese Methode verwendet werden:

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

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

        return Request.ServerVariables["REMOTE_ADDR"];
    }

5 Stimmen

Wie in einer anderen Antworten festgestellt wurde, kann HTTP_X_FORWARDED_FOR eine Liste von IPs sein, die durch Kommas getrennt sind.

0 Stimmen

Als Antwort auf die Funktion erhalte ich jedes Mal nur ::1. Kann ich nicht die vollständige IP-Adresse erhalten?

3 Stimmen

Es wird ::1 auf dem lokalen Host zurückgeben. Versuchen Sie es in der Produktionsumgebung und es sollte funktionieren.

27voto

Wenn es sich um C# handelt, sehen Sie es auf diese Weise, ist sehr einfach

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

9 Stimmen

Wenn beide Servervariablen null sein können, kann eine Ausnahme ausgelöst werden.

0 Stimmen

Was ist hier Request Referenzierung? Ich Servervariablen nicht gefunden.

0 Stimmen

HttpContext.Current.Request.

25voto

mmx Punkte 400975

Was sonst halten Sie die Benutzer-IP-Adresse? Wenn Sie die IP-Adresse des Netzwerkadapters möchten, befürchte ich, dass es in einer Web-App keinen möglichen Weg gibt. Wenn Ihr Benutzer hinter NAT oder anderen Dingen steckt, können Sie die IP auch nicht bekommen.

Update: Obwohl es Websites gibt, die die IP verwenden, um den Benutzer einzuschränken (wie rapidshare), funktionieren sie nicht korrekt in NAT-Umgebungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X