Express.js: comment faire pour obtenir l'adresse du client à distance
Je ne comprends pas complètement la façon dont je devrais obtenir une télécommande adresse IP de l'utilisateur.
Disons que j'ai une simple demande itinéraire tel que:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
Est l'approche ci-dessus correcte pour obtenir la véritable adresse IP de l'utilisateur ou est-il un meilleur moyen?
Et que dire de proxy?
- Comment sur l'utilisation de node-ipware que par l'explication ici.
- si vous ne pouvez pas obtenir req.nom d'hôte comme "example.com': stackoverflow.com/a/37824880/5333284
- Double Possible de Comment déterminer l'adresse IP de l'utilisateur dans le noeud
Vous devez vous connecter pour publier un commentaire.
Si vous êtes derrière un proxy comme NGiNX ou qu'avez-vous, seulement ensuite, vous devriez vérifier pour les "x-forwarded-for':
Si le proxy n'est pas "la vôtre", je n'aurais pas confiance dans les "x-forwarded-for' en-tête, car il peut être usurpée.
proxy_set_header X-Forwarded-For $remote_addr;
dans votre nginx configuration dans le cas où vous utilisez votre propre proxy inverse.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
pour obtenir l'adresse IP du client.::1
Tandis que la réponse de @alessioalex œuvres, il y a une autre façon, comme indiqué dans le Express derrière des proxys section de Express - guide.
app.enable('trust proxy')
pour exprimer votre code d'initialisation.req.ip
oureq.ips
de la manière habituelle (comme si il n'y a pas un reverse proxy)Plus d'options pour la confiance proxy " sont disponibles si vous avez besoin de quelque chose de plus sophistiqué que de faire confiance à tout ce passé à travers dans x-forwarded-for-tête, et votre proxy ne pas supprimer préexistante x-forwarded-for-tête à partir de sources non fiables. Consultez ce guide pour plus de détails.
REMARQUE:
req.connection.remoteAddress
ne fonctionne pas avec ma solution.app.enable('trust proxy')
fonctionne aussi utiliserreq.ip
. Sauf que je obtenez le port avec1.2.3.4:56789
. Pour la bande, je nevar ip = req.ip.split(':')[0]
req.headers['x-forwarded-for']
. Je crois que les deux regards à lax-forwarded-for
en-tête http.::1
?Dans
nginx.conf
fichier:proxy_set_header X-Real-IP $remote_addr;
Dans
node.js
serveur de fichier:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
noter que l'express en petit caractère en-têtes
req.headers['x-real-ip']
même dansnginx.conf
en-tête est défini avec capitalisés lettres.En particulier pour le nœud, la documentation du serveur http composant, en vertu de l'événement de connexion dit:
Donc, cela signifie qu'
request.connection
est un socket et selon la documentation, il n'y a en effet un socket.remoteAddress attribut qui, selon la documentation est:En vertu de l'express, l'objet de la requête est également une instance de Nœud requête http objet, de sorte que cette approche devrait toujours fonctionner.
Toutefois, en vertu de Express.js la demande a déjà deux attributs: req.ip et req.ips
Il peut être utile de mentionner que, selon ma compréhension, l'Express
req.ip
est une meilleure approche que lesreq.connection.remoteAddress
, depuisreq.ip
contient les ip du client (à condition de confiance que le proxy est activé dans l'express), tandis que l'autre peut contenir le proxy adresse IP (si il y en a un).C'est la raison pour laquelle actuellement accepté de répondre suggère:
La
req.headers['x-forwarded-for']
sera l'équivalent de l'expressreq.ip
.app.set('trust proxy', true)
req.ip
oureq.ips
de la manière habituelleSelon Express derrière des proxys,
req.ip
a pris en compte proxy inverse si vous avez configurétrust proxy
correctement. Par conséquent, il est mieux quereq.connection.remoteAddress
qui est obtenue à partir de la couche réseau et inconscients de proxy.Il suffit d'utiliser cette express middleware https://www.npmjs.com/package/express-ip
Vous pouvez installer le module à l'aide de
Utilisation
C'est juste de l'information supplémentaire pour cette réponse.
Si vous utilisez
nginx
, vous ajoutezproxy_set_header X-Real-IP $remote_addr;
à l'emplacement de bloc pour le site./etc/nginx/sites-available/www.example.com
par exemple. Voici un exemple de bloc de serveur.Après le redémarrage de
nginx
, vous serez en mesure d'accéder à la propriété intellectuelle dans votrenode
/express
application des routes avecreq.headers['x-real-ip'] || req.connection.remoteAddress;
Cela a fonctionné pour moi mieux que le reste. Mes sites sont derrière CloudFlare et il semblait exiger
cf-connecting-ip
.N'ai pas fait de test Express derrière des proxys comme il n'a rien dit à propos de ce
cf-connecting-ip
en-tête.Les en-têtes de l'objet a tout ce dont vous avez besoin, il suffit de faire ceci:
Je sais que cette question a été répondu, mais voici comment j'ai eu le mien à travailler.
var ip = req.connexion.remoteAddress;
ip = ip.split(':')[3];
ip = ip.split(':').pop();
seront pâte dans ce cas, si ip normale je.e 127.0.0.1 viendra, Il sera toujours en mesure de vous donner la propriété intellectuelle.