423 Stimmen

Express.js: Wie erhalte ich die Adresse eines entfernten Clients?

Ich verstehe nicht ganz, wie ich die IP-Adresse eines entfernten Benutzers erhalten soll.

Nehmen wir an, ich habe eine einfache Anfrage wie die folgende:

app.get(/, function (req, res){
   var forwardedIpsStr = req.header('x-forwarded-for');
   var IP = '';

   if (forwardedIpsStr) {
      IP = forwardedIps = forwardedIpsStr.split(',')[0];  
   }
});

Ist der oben beschriebene Ansatz richtig, um die echte IP-Adresse des Benutzers zu ermitteln, oder gibt es einen besseren Weg? Und was ist mit Proxys?

722voto

alessioalex Punkte 60195

Wenn Sie hinter einem Proxy wie NGiNX oder ähnlichem laufen, sollten Sie nur dann nach 'x-forwarded-for' :

var ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress 

Wenn der Proxy nicht "Ihrer" ist, würde ich dem Proxy nicht trauen. 'x-forwarded-for' Header, da er gefälscht werden kann.

328voto

Haozhun Punkte 5993

Die Antwort von @alessioalex funktioniert zwar, aber es gibt noch eine andere Möglichkeit, wie in der Express hinter Proxys Abschnitt von Express - Reiseführer .

  1. Ajouter app.set('trust proxy', true) zu Ihrem Express-Initialisierungscode hinzufügen.
  2. Wenn Sie die IP des entfernten Clients abrufen möchten, verwenden Sie req.ip o req.ips auf die übliche Weise (als ob es keinen umgekehrten Proxy gäbe)

Fakultative Lektüre:

  • Utilice req.ip o req.ips . req.connection.remoteAddress funktioniert mit dieser Lösung nicht.
  • Mehr Optionen für 'trust proxy' sind verfügbar, wenn Sie etwas Anspruchsvolleres brauchen, als sich auf alles zu verlassen, was in x-forwarded-for Header (z. B. wenn Ihr Proxy einen bereits vorhandenen x-forwarded-for-Header von nicht vertrauenswürdigen Quellen nicht entfernt). Weitere Einzelheiten finden Sie in der verlinkten Anleitung.
  • Wenn Ihr Proxyserver nicht mit x-forwarded-for Kopfzeile, gibt es zwei Möglichkeiten.
    1. Der Proxy-Server gibt keine Informationen darüber weiter, woher die Anfrage ursprünglich stammt. In diesem Fall gäbe es keine Möglichkeit herauszufinden, woher die Anfrage ursprünglich kam. Sie müssen zunächst die Konfiguration des Proxyservers ändern.
      • Wenn Sie zum Beispiel nginx als Reverse-Proxy verwenden, müssen Sie möglicherweise Folgendes hinzufügen proxy_set_header X-Forwarded-For $remote_addr; zu Ihrer Konfiguration.
    2. Der Proxyserver leitet die Informationen darüber, woher die Anfrage ursprünglich stammt, in einer eigenen Form weiter (z. B. benutzerdefinierter http-Header). In einem solchen Fall würde diese Antwort nicht funktionieren. Möglicherweise gibt es einen benutzerdefinierten Weg, um diese Informationen herauszufinden, aber Sie müssen zuerst den Mechanismus verstehen.

75voto

ququzone Punkte 743

Unter nginx.conf Datei:
proxy_set_header X-Real-IP $remote_addr;

Unter node.js Server-Datei:
var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;

beachten Sie, dass Express-Kopfzeilen klein geschrieben werden

47voto

Hongbo Miao Punkte 39052

Wenn Sie eine Bibliothek eines Drittanbieters verwenden, ist das in Ordnung. Sie können prüfen Anfrage-IP .

Sie können es verwenden, indem Sie

import requestIp from 'request-ip';

app.use(requestIp.mw())

app.use((req, res) => {
  const ip = req.clientIp;
});

Der Quellcode ist ziemlich lang, daher werde ich ihn hier nicht kopieren, Sie können ihn unter https://github.com/pbojinov/request-ip/blob/master/src/index.js

Im Grunde genommen,

Es sucht nach bestimmten Kopfzeilen in der Anfrage und greift auf einige Standardwerte zurück, wenn sie nicht vorhanden sind.

Die Benutzer-IP wird in der folgenden Reihenfolge bestimmt:

  1. X-Client-IP
  2. X-Forwarded-For (Header kann mehrere IP-Adressen in diesem Format zurückgeben: "Client-IP, Proxy-1-IP, Proxy-2-IP", wir nehmen also die erste die erste.)
  3. CF-Connecting-IP (Cloudflare)
  4. Fastly-Client-Ip (Fastly CDN und Firebase-Hosting-Header, wenn sie für eine Cloud-Funktion vorgesehen sind)
  5. True-Client-Ip (Akamai und Cloudflare)
  6. X-Real-IP (Nginx-Proxy/FastCGI)
  7. X-Cluster-Client-IP (Rackspace LB, Riverbed Stingray)
  8. X-Forwarded , Forwarded-For y Forwarded (Variationen von #2)
  9. req.connection.remoteAddress
  10. req.socket.remoteAddress
  11. req.connection.socket.remoteAddress
  12. req.info.remoteAddress

Wenn eine IP-Adresse nicht gefunden wird, wird zurückgegeben null .

Offenlegen: Ich bin nicht mit der Bibliothek verbunden.

34voto

Edwin Dalorzo Punkte 73377

Speziell für Node ist die Dokumentation für die http-Server-Komponente unter Ereignisverbindung sagt:

[Ausgelöst] wenn ein neuer TCP-Stream aufgebaut wird. [Der] Socket ist ein Objekt vom Typ net.Socket. Normalerweise werden Benutzer nicht auf dieses Ereignis zugreifen wollen. Unter Insbesondere wird der Socket keine lesbaren Ereignisse ausgeben, da der der Protokollparser an den Socket gebunden ist. Der Socket kann auch zugegriffen werden unter request.connection .

Das bedeutet also request.connection ist ein Socket und laut der Dokumentation gibt es tatsächlich eine socket.remoteAddress Attribut, das der Dokumentation zufolge lautet:

Die String-Darstellung der entfernten IP-Adresse. Zum Beispiel, 74.125.127.100" oder "2001:4860:a005::68".

Unter express ist das Request-Objekt ebenfalls eine Instanz des Node http-Request-Objekts, so dass dieser Ansatz weiterhin funktionieren sollte.

Unter Express.js hat die Anfrage jedoch bereits zwei Attribute: req.ip y req.ips

req.ip

Rückgabe der entfernten Adresse oder - wenn "trust proxy" aktiviert ist - der vorgelagerten Adresse.

req.ips

Wenn "Vertrauensvollmacht" es true wird die "X-Forwarded-For"-IP-Adressliste geparst und ein Array zurückgegeben, andernfalls wird ein leeres Array zurückgegeben. Wenn der Wert zum Beispiel "client, proxy1, proxy2" wäre würde man das Array ["client", "proxy1", "proxy2"] erhalten, wobei "proxy2" der am weitesten nachgelagerte ist.

Es ist erwähnenswert, dass meines Wissens nach die Express req.ip ist ein besserer Ansatz als req.connection.remoteAddress da req.ip enthält die tatsächliche Client-IP-Adresse (vorausgesetzt, der vertrauenswürdige Proxy ist in express aktiviert), während die andere die IP-Adresse des Proxys enthalten kann (falls vorhanden).

Das ist der Grund, warum die derzeit akzeptierte Antwort vorschlägt:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

En req.headers['x-forwarded-for'] ist das Äquivalent zu express req.ip .

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