web-dev-qa-db-fra.com

Comment déterminer l'adresse IP d'un utilisateur dans le noeud

Comment puis-je déterminer l'adresse IP d'une requête donnée à partir d'un contrôleur? Par exemple (en express):

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

Dans votre objet request, il existe une propriété appelée connection, qui est un objet net.Socket. L'objet net.Socket a une propriété remoteAddress, vous devriez donc pouvoir obtenir l'adresse IP avec cet appel:

request.connection.remoteAddress

Voir la documentation sur http et net

MODIFIER

Comme @juand le fait remarquer dans les commentaires, la méthode correcte pour obtenir l'adresse IP distante, si le serveur est derrière un proxy, est 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);

Notez que vous pouvez parfois obtenir plusieurs adresses IP dans req.headers['x-forwarded-for']. En outre, un en-tête x-forwarded-for ne sera pas toujours défini, ce qui peut générer une erreur.

Le format général du champ est:

x-forwarded-for:client, proxy1, proxy2, proxy3

où la valeur est une liste d'adresses IP séparées par des virgules + espaces, la plus à gauche étant le client d'origine et chaque proxy successif ayant transmis la demande en ajoutant l'adresse IP d'où il a reçu la demande. Dans cet exemple, la demande passée par proxy1, proxy2, puis proxy3. proxy3 apparaît comme adresse distante de la demande.

C'est la solution suggérée par Arnav Gupta avec un correctif Martin a suggéré ci-dessous dans les commentaires pour les cas où x-forwarded-for n'est pas défini: 

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

Si vous utilisez express ...

req.ip

Je cherchais ça alors j'étais comme attendre, j'utilise express. Duh.

33
Jason Sebring

Vous pouvez rester SEC et utiliser simplement node-ipware qui prend en charge IPv4 et IPv6.

Installer:

npm install ipware

Dans votre application ou 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();
});

Il essaiera au mieux d’obtenir l’adresse IP de l’utilisateur ou retournera 127.0.0.1 pour indiquer qu’il n’a pas pu déterminer l’adresse IP de cet utilisateur. Regardez le fichier README pour les options avancées.

29
un33k

Vous pouvez utiliser request-ip , pour récupérer l'adresse IP d'un utilisateur. Il gère un certain nombre de cas Edge différents, dont certains sont mentionnés dans les autres réponses.

Divulgation: j'ai créé ce module 

Installer:

npm install request-ip

Dans votre application:

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();
};

J'espère que cela t'aides

19
pbojinov

La fonction suivante a tous les cas couverts aidera 

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
ashishyadaveee11

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

Si l'en-tête x-forwarded-for est présent, utilisez-le, sinon utilisez la propriété .remoteAddress

L'en-tête x-forwarded-for est ajouté aux demandes qui passent par les équilibreurs de charge (ou d'autres types de proxy) configurés pourHTTPouHTTPS(il est également possible d'ajouter cet en-tête aux demandes lors de l'équilibrage à unTCPlevel en utilisant protocole proxy ). En effet, la propriété request.connection.remoteAddress contiendra l'adresse IP privée de l'équilibreur de charge plutôt que l'adresse IP publique du client. En utilisant une instructionOU, dans l'ordre indiqué ci-dessus, vous vérifiez l'existence d'un en-tête x-forwarded-for et vous l'utilisez s'il existe, sinon utilisez le request.connection.remoteAddress

12
Ben Davies

Si vous utilisez Express version 3.x ou supérieure, vous pouvez utiliser le paramètre de proxy de confiance ( http://expressjs.com/api.html#trust.proxy.options.table ) et il suivra chaîne d'adresses dans l'en-tête x-forwarded-for et placez la dernière adresse IP dans la chaîne que vous n'avez pas configurée en tant que proxy approuvé dans la propriété ip de l'objet req.

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

Il y a deux façons d'obtenir l'adresse IP: 

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

Mais il y a un problème avec les approches ci-dessus. 

Si vous exécutez votre application derrière Nginx ou un proxy, chaque adresse IP sera 127.0.0.1.

Donc, la meilleure solution pour obtenir l'adresse ip de l'utilisateur est: -

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

Obtenir une adresse IP distante dans nodejs:

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

Si vous avez plusieurs adresses IP, cela fonctionne pour moi: 

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

2
Kirill Chatrov

Je me rends compte que la réponse à cette question a été fatale, mais voici une version moderne de l’ES6 que j’ai écrite et qui respecte les normes Eslint de la base aérienne.

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;
};

L'en-tête X-Forwarded-For peut contenir une liste d'adresses IP proxy séparées par des virgules. La commande est client, proxy1, proxy2, ..., proxyN. Dans le monde réel, les personnes implémentent des mandataires qui peuvent fournir ce qu'ils veulent dans cet en-tête. Si vous êtes derrière un équilibreur de charge ou autre chose, vous pouvez au moins faire confiance à la première adresse IP de la liste, quel que soit le proxy utilisé par une requête.

1
Misha Nasledov

Attention:

Ne vous contentez pas de l'utiliser aveuglément pour limiter considérablement le débit:

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

Il est très facile de parodier:

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

Dans ce cas, la véritable adresse IP de l'utilisateur sera:

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

Je suis surpris qu'aucune autre réponse n'ait mentionné cela.

1
user10898116

Dans le noeud 10.14, derrière nginx, vous pouvez récupérer l'ip en le demandant via l'en-tête nginx comme ceci: 

proxy_set_header X-Real-IP $remote_addr;

Puis dans votre app.js:

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

Après cela, où vous voulez qu'il apparaisse:

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