Ich verstehe nicht ganz, wie ich eine IP-Adresse eines Remotebenutzers erhalten soll.
Angenommen, 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? Und was ist mit Proxies?
node.js
express
ip
ip-address
Erik
quelle
quelle
Antworten:
Wenn Sie hinter einem Proxy wie NGiNX laufen oder was Sie haben, sollten Sie nur dann nach 'x-forwarded-for' suchen:
Wenn der Proxy nicht "Ihr" ist, würde ich dem "x-forwarded-for" -Header nicht vertrauen, da er gefälscht werden kann.
quelle
proxy_set_header X-Forwarded-For $remote_addr;
in Ihre Nginx-Konfiguration einfügen müssen, falls Sie Ihren eigenen Reverse-Proxy verwenden.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
Client-IP zu bekommen.Während die Antwort von @alessioalex funktioniert, gibt es einen anderen Weg, wie im Abschnitt Express hinter Proxys des Express-Leitfadens angegeben .
app.set('trust proxy', true)
Ihrem Express-Initialisierungscode hinzu.req.ip
oderreq.ips
auf die übliche Weise (als ob es keinen Reverse-Proxy gibt).Optionale Lesung:
req.ip
oderreq.ips
.req.connection.remoteAddress
funktioniert mit dieser Lösung nicht.'trust proxy'
stehen zur Verfügung, wenn Sie etwas Anspruchsvolleres benötigen, als alles zu vertrauen, was imx-forwarded-for
Header durchlaufen wird (z. B. wenn Ihr Proxy bereits vorhandene x-forwarded-for-Header nicht aus nicht vertrauenswürdigen Quellen entfernt). Weitere Informationen finden Sie in der verlinkten Anleitung.x-forwarded-for
Header ausfüllt, gibt es zwei Möglichkeiten.proxy_set_header X-Forwarded-For $remote_addr;
Ihre Konfiguration erweitern.quelle
app.enable('trust proxy')
funktioniert auch zu verwendenreq.ip
. Außer ich bekomme den Port damit1.2.3.4:56789
. Um das zu entfernen, mache ichvar ip = req.ip.split(':')[0]
In
nginx.conf
Datei:proxy_set_header X-Real-IP $remote_addr;
In der
node.js
Serverdatei:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
Beachten Sie, dass Kleinbuchstaben ausgedrückt werden
quelle
req.headers['x-real-ip']
wenn dernginx.conf
Header mit Großbuchstaben gesetzt ist.Insbesondere für Knoten heißt es in der Dokumentation für die http-Serverkomponente unter Ereignisverbindung :
Das heißt also, es
request.connection
handelt sich um einen Socket, und gemäß der Dokumentation gibt es tatsächlich ein socket.remoteAddress- Attribut, das gemäß der Dokumentation lautet: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
Es kann erwähnenswert sein, dass der Express nach meinem Verständnis
req.ip
ein besserer Ansatz ist alsreq.connection.remoteAddress
, da erreq.ip
die tatsächliche Client-IP enthält (vorausgesetzt, dass der vertrauenswürdige Proxy in Express aktiviert ist), während der andere möglicherweise die IP-Adresse des Proxys enthält (falls vorhanden) einer).Aus diesem Grund schlägt die derzeit akzeptierte Antwort vor:
Das
req.headers['x-forwarded-for']
wird das Äquivalent von Express seinreq.ip
.quelle
app.set('trust proxy', true)
req.ip
oderreq.ips
in der üblichen Weisequelle
Dies sind nur zusätzliche Informationen für diese Antwort .
Wenn Sie verwenden
nginx
, würden Sieproxy_set_header X-Real-IP $remote_addr;
den Standortblock für die Site hinzufügen ./etc/nginx/sites-available/www.example.com
beispielsweise. Hier ist ein Beispiel für einen Serverblock.Nach dem Neustart
nginx
können Sie auf die IP in Ihrennode
/express
Anwendungsrouten mit zugreifenreq.headers['x-real-ip'] || req.connection.remoteAddress;
quelle
Laut Express hinter Proxies ,
req.ip
berücksichtigt hat Reverse - Proxy genommen , wenn Sie so konfiguriert haben ,trust proxy
richtig. Daher ist es besser alsreq.connection.remoteAddress
das, was von der Netzwerkschicht erhalten wird und kein Proxy kennt.quelle
Zu diesem Zweck habe ich ein Paket geschrieben. Sie können es als Express-Middleware verwenden. Mein Paket wird hier veröffentlicht: https://www.npmjs.com/package/express-ip
Sie können das Modul mit installieren
Verwendung
quelle
Ich weiß, dass diese Frage beantwortet wurde, aber hier ist, wie ich meine zum Arbeiten gebracht habe.
quelle
Wenn Sie die Bibliothek eines Drittanbieters verwenden können. Sie können request-ip überprüfen .
Sie können es von verwenden
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 überprüfen
Grundsätzlich,
Offenlegung: Ich bin nicht mit der Bibliothek verbunden.
quelle
Das hat bei mir besser funktioniert als bei den anderen. Meine Websites stehen hinter CloudFlare und es schien erforderlich zu sein
cf-connecting-ip
.Ich habe Express nicht hinter Proxys getestet, da es nichts über diesen
cf-connecting-ip
Header aussagt.quelle
Mit der Unterstützung von Could-Flare, Nginx und X-Real-IP
quelle
In meinem Fall habe ich ähnlich wie bei dieser Lösung den folgenden x-forwarded-for- Ansatz verwendet:
x-forwarded-for
Der Header fügt weiterhin die Route der IP vom Ursprung bis zum endgültigen Zielserver hinzu. Wenn Sie also die IP des Ursprungsclients abrufen müssen, ist dies das erste Element des Arrays.quelle
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
quelle
ip = ip.split(':').pop();
wird in diesem Fall Teig sein, wenn normale IP, dh 127.0.0.1, kommt. Es wird immer noch in der Lage sein, Ihnen IP zu geben.Das Header-Objekt enthält alles, was Sie benötigen. Führen Sie dazu Folgendes aus:
quelle
Alles zusammen witk @kakopappa Lösung plus
morgan
Protokollierung der Client-IP-Adresse:quelle