Je ne comprends pas complètement comment obtenir une adresse IP d'utilisateur distant.
Disons que j'ai un itinéraire de demande simple tel que:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
L'approche ci-dessus est-elle correcte pour obtenir la véritable adresse IP de l'utilisateur ou existe-t-il un meilleur moyen? Et qu'en est-il des procurations?
node.js
express
ip
ip-address
Erik
la source
la source
Réponses:
Si vous courez derrière un proxy comme NGiNX ou quoi que ce soit, alors seulement, vous devriez vérifier «x-forwarded-for»:
Si le proxy n'est pas le vôtre, je ne ferais pas confiance à l'en-tête «x-forwarded-for», car il peut être usurpé.
la source
proxy_set_header X-Forwarded-For $remote_addr;
dans votre configuration nginx au cas où vous utilisez votre propre proxy inverse.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
Faites peut-être quelque chose comme obtenir l'adresse IP du client.Bien que la réponse de @alessioalex fonctionne, il existe un autre moyen, comme indiqué dans la section Express derrière les proxys d' Express - guide .
app.set('trust proxy', true)
à votre code d'initialisation express.req.ip
oureq.ips
de la manière habituelle (comme s'il n'y avait pas de proxy inverse)Lecture facultative:
req.ip
oureq.ips
.req.connection.remoteAddress
ne fonctionne pas avec cette solution.'trust proxy'
sont disponibles si vous avez besoin de quelque chose de plus sophistiqué que de faire confiance à tout ce qui est passé dans l'en-x-forwarded-for
tête (par exemple, lorsque votre proxy ne supprime pas l'en-tête x-forwarded-for préexistant des sources non fiables). Voir le guide lié pour plus de détails.x-forwarded-for
tête, il y a deux possibilités.proxy_set_header X-Forwarded-For $remote_addr;
à votre configuration.la source
app.enable('trust proxy')
fonctionne aussi à utiliserreq.ip
. Sauf que j'obtiens le port avec1.2.3.4:56789
. Pour retirer cela, je le faisvar ip = req.ip.split(':')[0]
En
nginx.conf
dossier:proxy_set_header X-Real-IP $remote_addr;
Dans
node.js
le fichier serveur:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
notez que les en-têtes minuscules express
la source
req.headers['x-real-ip']
même dans l'en-nginx.conf
tête est définie avec des lettres majuscules.En particulier pour le nœud, la documentation du composant serveur http, sous connexion d'événement, indique:
Donc, cela signifie qu'il
request.connection
s'agit d'un socket et selon la documentation, il y a en effet un attribut socket.remoteAddress qui, selon la documentation, est:Sous express, l'objet de requête est également une instance de l'objet de requête Node http, donc cette approche devrait toujours fonctionner.
Cependant, sous Express.js, la demande a déjà deux attributs: req.ip et req.ips
Il convient de mentionner que, selon moi, l'Express
req.ip
est une meilleure approche quereq.connection.remoteAddress
, puisquereq.ip
contient l'IP du client réel (à condition que le proxy de confiance soit activé dans express), tandis que l'autre peut contenir l'adresse IP du proxy (s'il y a une).C'est la raison pour laquelle la réponse actuellement acceptée suggère:
Le
req.headers['x-forwarded-for']
sera l'équivalent d'expressreq.ip
.la source
app.set('trust proxy', true)
req.ip
oureq.ips
de la manière habituellela source
Ce ne sont que des informations supplémentaires pour cette réponse .
Si vous utilisez
nginx
, vous ajouteriezproxy_set_header X-Real-IP $remote_addr;
au bloc d'emplacement du site./etc/nginx/sites-available/www.example.com
par exemple. Voici un exemple de bloc serveur.Après le redémarrage
nginx
, vous pourrez accéder à l'ip dans vos routesnode
/express
application avecreq.headers['x-real-ip'] || req.connection.remoteAddress;
la source
Selon Express derrière les proxys ,
req.ip
a pris en compte le proxy inverse si vous l'avez configurétrust proxy
correctement. Par conséquent, il vaut mieux quereq.connection.remoteAddress
ce qui est obtenu à partir de la couche réseau et ignore le proxy.la source
J'ai écrit un paquet à cet effet. Vous pouvez l'utiliser comme middleware express. Mon package est publié ici: https://www.npmjs.com/package/express-ip
Vous pouvez installer le module en utilisant
Usage
la source
Je sais qu'on a répondu à cette question, mais voici comment j'ai fait travailler la mienne.
la source
Si vous êtes bien en utilisant une bibliothèque tierce. Vous pouvez vérifier request-ip .
Vous pouvez l'utiliser c'est par
Le code source est assez long, donc je ne copierai pas ici, vous pouvez vérifier à https://github.com/pbojinov/request-ip/blob/master/src/index.js
Fondamentalement,
Divulgation: je ne suis pas associé à la bibliothèque.
la source
Cela a fonctionné pour moi mieux que les autres. Mes sites sont derrière CloudFlare et cela semblait nécessiter
cf-connecting-ip
.N'a pas testé Express derrière les procurations car il ne disait rien sur cet en-
cf-connecting-ip
tête.la source
Avec prise en charge de pourrait-flare, nginx et x-real-ip
la source
Dans mon cas, similaire à cette solution, j'ai fini par utiliser l' approche x-forwarded-for suivante :
x-forwarded-for
L'en-tête continuera d'ajouter l'itinéraire de l'IP de l'origine jusqu'au serveur de destination finale, donc si vous avez besoin de récupérer l'IP du client d'origine, ce serait le premier élément du tableau.la source
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
la source
ip = ip.split(':').pop();
sera la pâte dans ce cas si l'ip normale, c'est-à-dire 127.0.0.1 viendra, il sera toujours en mesure de vous donner l'ip.L'objet headers a tout ce dont vous avez besoin, procédez comme suit:
la source
Assemblage de la solution witk @kakopappa et de la
morgan
journalisation de l'adresse IP du client:la source