it-swarm.com.de

So ermitteln Sie die IP-Adresse eines Benutzers im Knoten

Wie kann ich die IP-Adresse einer bestimmten Anforderung von einem Controller aus ermitteln? Zum Beispiel (in Express):

app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})
275
Shamoon

In Ihrem request-Objekt gibt es eine Eigenschaft namens connection, die ein net.Socket-Objekt ist. Das net.Socket-Objekt hat eine Eigenschaft remoteAddress, daher sollten Sie die IP mit diesem Aufruf erhalten können:

request.connection.remoteAddress

Siehe Dokumentation für http und net

EDIT

Wie @juand in den Kommentaren darauf hinweist, lautet die korrekte Methode zum Abrufen der Remote-IP, wenn sich der Server hinter einem Proxy befindet, request.headers['x-forwarded-for'].

370
topek
var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     (req.connection.socket ? req.connection.socket.remoteAddress : null);

Beachten Sie, dass Sie manchmal mehr als eine IP-Adresse in req.headers['x-forwarded-for'] erhalten können. Es wird auch nicht immer ein x-forwarded-for-Header gesetzt, der einen Fehler auslösen kann.

Das allgemeine Format des Feldes ist:

x-weitergeleitet für:client, proxy1, proxy2, proxy3

wobei der Wert eine durch Komma + Leerzeichen getrennte Liste von IP-Adressen ist, wobei der linke Client der ursprüngliche Client ist und jeder nachfolgende Proxy, der die Anforderung übergeben hat, die IP-Adresse hinzufügt, von der er die Anforderung erhalten hat. In diesem Beispiel wurde die Anforderung durch proxy1, proxy2 und dann proxy3 übergeben. proxy3 erscheint als Remote-Adresse der Anfrage.

Dies ist die von Arnav Gupta mit einem Fix Martin vorgeschlagene Lösung, die unten in den Kommentaren für Fälle vorgeschlagen wird, in denen x-forwarded-for nicht gesetzt ist: 

var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress
338
Edmar Miyake

Wenn Sie Express verwenden ...

req.ip

Ich schaute mir das an, ich war wie warten, ich verwende Express. Duh.

33
Jason Sebring

Sie können TROCKEN bleiben und einfach node-ipware verwenden, das sowohl IPv4 als auch IPv6 unterstützt.

Installieren:

npm install ipware

In Ihrer app.js oder Middleware:

var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ipInfo = getIP(req);
    console.log(ipInfo);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

Es wird der beste Versuch unternommen, die IP-Adresse des Benutzers abzurufen oder 127.0.0.1 zurückzugeben, um anzuzeigen, dass die IP-Adresse des Benutzers nicht ermittelt werden konnte. In der Datei README finden Sie erweiterte Optionen.

29
un33k

Sie können request-ip verwenden, um die IP-Adresse eines Benutzers abzurufen. Es behandelt einige der verschiedenen Edge-Fälle, von denen einige in den anderen Antworten erwähnt werden.

Offenlegung: Ich habe dieses Modul erstellt 

Installieren:

npm install request-ip

In deiner App:

var requestIp = require('request-ip');

// inside middleware handler
var ipMiddleware = function(req, res, next) {
    var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1
    next();
};

Hoffe das hilft

19
pbojinov

Mit der folgenden Funktion können alle Fälle abgedeckt werden 

var ip;
if (req.headers['x-forwarded-for']) {
    ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
    ip = req.connection.remoteAddress;
} else {
    ip = req.ip;
}console.log("client IP is *********************" + ip);
12

request.headers['x-forwarded-for'] || request.connection.remoteAddress

Wenn der x-forwarded-for-Header vorhanden ist, verwenden Sie diesen, ansonsten verwenden Sie die .remoteAddress-Eigenschaft. 

Der x-forwarded-for-Header wird zu Anforderungen hinzugefügt, die Lastverteiler (oder andere Arten von Proxy) durchlaufen, die fürHTTPoderHTTPSeingerichtet sind (es ist auch möglich, diesen Header zu Anforderungen hinzuzufügen, wenn der Balancing-Modus verwendet wird.) aTCPlevel mit Proxy-Protokoll ). Dies liegt daran, dass die request.connection.remoteAddress-Eigenschaft die private IP-Adresse des Lastenausgleichs statt der öffentlichen IP-Adresse des Clients enthält. Mit der AnweisungODERprüfen Sie in der obigen Reihenfolge, ob ein x-forwarded-for-Header vorhanden ist, und verwenden Sie ihn, falls er vorhanden ist. Andernfalls verwenden Sie den request.connection.remoteAddress

12
Ben Davies

Wenn Sie die Express-Version 3.x oder höher verwenden, können Sie die Einstellung für den Vertrauens-Proxy ( http://expressjs.com/api.html#trust.proxy.options.table ) verwenden Adressenkette im x-forwarded-for-Header und fügen Sie die letzte IP-Adresse in der Kette, die Sie nicht als vertrauenswürdigen Proxy konfiguriert haben, in die ip-Eigenschaft des req-Objekts ein.

6
Michael Lang

function getCallerIP(request) {
    var ip = request.headers['x-forwarded-for'] ||
        request.connection.remoteAddress ||
        request.socket.remoteAddress ||
        request.connection.socket.remoteAddress;
    ip = ip.split(',')[0];
    ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx"
    return ip;
}

6
Ahmad Agbaryah

Es gibt zwei Möglichkeiten, die IP-Adresse abzurufen: 

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

Bei den oben genannten Ansätzen besteht jedoch ein Problem. 

Wenn Sie Ihre App hinter Nginx oder einem anderen Proxy ausführen, lautet jede einzelne IP-Adresse 127.0.0.1.

Die beste Lösung, um die IP-Adresse des Benutzers zu erhalten, ist: -

let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
6
Mansi Teharia

Einfach Remote-IP in nodejs holen:

var ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
3
Dung Vu

Wenn Sie mehrere IPs erhalten, funktioniert das für mich: 

var ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];

2
Kirill Chatrov

Ich weiß, dass dies zu Tode geantwortet wurde, aber hier ist eine moderne ES6-Version, die ich geschrieben habe und die den Airbnb-Standard entspricht.

const getIpAddressFromRequest = (request) => {
  let ipAddr = request.connection.remoteAddress;

  if (request.headers && request.headers['x-forwarded-for']) {
    [ipAddr] = request.headers['x-forwarded-for'].split(',');
  }

  return ipAddr;
};

Der X-Forwarded-For-Header kann eine durch Kommas getrennte Liste von Proxy-IPs enthalten. Die Bestellung lautet client, proxy1, proxy2, ..., proxyN. In der realen Welt implementieren die Leute Proxies, die in diesem Header alles liefern, was sie wollen. Wenn Sie sich hinter einem Load Balancer oder etwas befinden, können Sie zumindest der ersten IP-Adresse in der Liste vertrauen. Dies ist zumindest der Proxy, für den eine Anfrage gestellt wurde.

1
Misha Nasledov

Warnung:

Verwenden Sie dies nicht nur blind für wichtige Geschwindigkeitsbegrenzungen:

let ip = request.headers['x-forwarded-for'].split(',')[0];

Es ist sehr leicht zu fälschen:

curl --header "X-Forwarded-For: 1.2.3.4" "https://example.com"

In diesem Fall lautet die tatsächliche IP-Adresse des Benutzers:

let ip = request.headers['x-forwarded-for'].split(',')[1];

Ich bin überrascht, dass keine anderen Antworten dies erwähnt haben.

1
user10898116

In Knoten 10.14 hinter nginx können Sie die IP abrufen, indem Sie sie wie folgt über den Nginx-Header anfordern: 

proxy_set_header X-Real-IP $remote_addr;

Dann in Ihrer app.js:

app.set('trust proxy', true);

Danach, wo immer Sie möchten, dass es erscheint:

var userIp = req.header('X-Real-IP') || req.connection.remoteAddress;
0
Alexandru