it-swarm.com.de

Express.js: So erhalten Sie die Remote-Clientadresse

Ich kann nicht ganz verstehen, wie ich eine Remote-Benutzer-IP-Adresse erhalten soll.

Nehmen wir an, ich habe eine einfache Anforderungsroute wie:

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

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

Ist der obige Ansatz korrekt, um die tatsächliche Benutzer-IP-Adresse zu erhalten, oder gibt es einen besseren Weg?

183
Erik

Wenn Sie hinter einem Proxy wie NGiNX oder was auch immer laufen, sollten Sie nur nach "x-forwarded-for" suchen:

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

Wenn der Proxy nicht "Ihr" ist, würde ich dem "X-Forwarded-for" -Header nicht trauen, da er gefälscht werden kann.

357
alessioalex

Während die Antwort von @alessioalex funktioniert, gibt es einen anderen Weg, wie im Abschnitt Express hinter Proxies von Express - guide angegeben.

  1. Fügen Sie app.enable('trust proxy') zu Ihrem Expressinitialisierungscode hinzu.
  2. Wenn Sie die IP des Remote-Clients abrufen möchten, verwenden Sie req.ip oder req.ips wie gewohnt (als ob kein Reverse-Proxy vorhanden wäre).

Weitere Optionen für "Vertrauens-Proxy" stehen zur Verfügung, wenn Sie etwas anspruchsvolleres als das Vertrauen auf alles, was in x-forwarded-for-Header durchlaufen wird, benötigen und Ihr Proxy den bereits vorhandenen x-forwarded-for-Header nicht aus nicht vertrauenswürdigen Quellen entfernt. Weitere Informationen finden Sie in der verlinkten Anleitung.

HINWEIS: req.connection.remoteAddress funktioniert nicht mit meiner Lösung.

184
Haozhun

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

In node.js Serverdatei: 
var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;

Beachten Sie, dass die Überschriften der unteren Zeilen zum Ausdruck kommen

48
ququzone

Die Dokumentation für die http-Serverkomponente unter event connection besagt insbesondere für Knoten:

[Ausgelöst], wenn ein neuer TCP - Stream eingerichtet wird. [Der] Socket ist ein Objekt vom Typ net.Socket. Normalerweise möchten Benutzer nicht auf dieses Ereignis zugreifen. Im Insbesondere gibt der Socket aufgrund dessen, wie .__, keine lesbaren Ereignisse aus. Der Protokoll-Parser wird mit dem Socket verbunden. Der Sockel kann auch .__ sein. Zugriff auf request.connection.

Das heißt, request.connection ist ein Socket und laut Dokumentation gibt es tatsächlich ein socket.remoteAddress -Attribut, das laut Dokumentation:

Die Zeichenfolgendarstellung der Remote-IP-Adresse. Zum Beispiel, '74 .125.127.100 'oder' 2001: 4860: a005 :: 68 '.

Unter express ist das Anforderungsobjekt auch eine Instanz des Node http-Anforderungsobjekts. Daher sollte dieser Ansatz weiterhin funktionieren. 

Unter Express.js hat die Anforderung jedoch bereits zwei Attribute: req.ip und req.ips

req.ip 

Geben Sie die Remote-Adresse zurück oder, wenn "Trust Proxy" aktiviert ist - die Upstream-Adresse.

req.ips 

Wenn "trust proxy"true ist, analysieren Sie die IP-Adressliste "X-Forwarded-For" und geben Sie ein Array zurück. Andernfalls ist ein leeres Array ist zurückgekommen. Wenn der Wert beispielsweise "Client, Proxy1, Proxy2" lautet, geben Sie würde das Array ["Client", "Proxy1", "Proxy2"] erhalten, wobei "Proxy2" ist am weitesten stromabwärts.

Es kann erwähnenswert sein, dass nach meinem Verständnis der Express req.ip ein besserer Ansatz ist als req.connection.remoteAddress, da req.ip die tatsächliche Client-IP enthält (sofern der vertrauenswürdige Proxy in express aktiviert ist), während der andere die IP-Adresse des Proxys enthält wenn es einen gibt). 

Das ist der Grund, warum die derzeit akzeptierte Antwort darauf hinweist:

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

Der req.headers['x-forwarded-for'] entspricht dem Ausdruck req.ip.

26
Edwin Dalorzo
  1. app.set('trust proxy', true) hinzufügen
  2. Verwenden Sie req.ip oder req.ips wie gewohnt
4
Bald

Laut Express hinter Proxies hat req.ip den Reverse Proxy berücksichtigt, wenn Sie trust proxy richtig konfiguriert haben. Daher ist es besser als req.connection.remoteAddress, der von der Netzwerkschicht abgerufen wird und keinen Proxy kennt.

3
abbr

Das Header-Objekt enthält alles, was Sie brauchen: 

var ip = req.headers['x-forwarded-for'].split(',')[0];
1
Juan David Arce

Das funktionierte für mich besser als der Rest. Meine Websites liegen hinter CloudFlare und es schien, dass cf-connecting-ip erforderlich war. 

req.headers['cf-connecting-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress

Express hinter Proxies nicht getestet da es nichts über diesen cf-connecting-ip-Header gesagt hat.

1
ile

Verwenden Sie einfach diese Express-Middleware https://www.npmjs.com/package/express-ip

Sie können das Modul mit installieren 

npm i express-ip

Verwendungszweck

const express = require('express');
const app = express();
const expressip = require('express-ip');
app.use(expressip().getIpInfoMiddleware);

app.get('/', function (req, res) {
    console.log(req.ipInfo);
});
1
Oyetoke Tobi

Dies ist nur eine zusätzliche Information für diese Antwort .

Wenn Sie nginx verwenden, fügen Sie dem Standortblock für die Site proxy_set_header X-Real-IP $remote_addr; hinzu. /etc/nginx/sites-available/www.example.com zum Beispiel. Hier ist ein Beispiel für einen Serverblock.

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    location / {
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_pass http://127.0.1.1:3080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $Host;
        proxy_cache_bypass $http_upgrade;
    }
}

Nach dem Neustart von nginx können Sie mit req.headers['x-real-ip'] || req.connection.remoteAddress; auf die IP-Adresse in Ihrer node/express-Anwendung zugreifen.

1
learnsomemore

var ip = req.connection.remoteAddress;

ip = ip.split (':') [3];

0
Bhulawat Ajay

Mit Unterstützung für could-flare, nginx und x-real-ip

var user_ip;

    if(req.headers['cf-connecting-ip'] && req.headers['cf-connecting-ip'].split(', ').length) {
      let first = req.headers['cf-connecting-ip'].split(', ');
      user_ip = first[0];
    } else {
      let user_ip = req.headers['x-forwarded-for'] || req.headers['x-real-ip'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress;
    }
0
kakopappa

Ich weiß, dass diese Frage beantwortet wurde, aber so habe ich meine zur Arbeit gebracht.

let ip = req.connection.remoteAddress.split(`:`).pop();
0
Lorem Ipsum