Express.js: cómo obtener la dirección de un cliente remoto

Resuelto Erik asked hace 12 años • 16 respuestas

No entiendo completamente cómo debo obtener una dirección IP de usuario remoto.

Digamos que tengo una ruta de solicitud simple como:

app.get(/, function (req, res){
   var forwardedIpsStr = req.header('x-forwarded-for');
   var IP = '';

   if (forwardedIpsStr) {
      IP = forwardedIps = forwardedIpsStr.split(',')[0];  
   }
});

¿Es correcto el enfoque anterior para obtener la dirección IP real del usuario o existe una manera mejor? ¿Y qué pasa con los apoderados?

Erik avatar Jun 01 '12 18:06 Erik
Aceptado

Si está ejecutando detrás de un proxy como NGiNX o lo que sea, solo entonces debe verificar 'x-forwarded-for':

var ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress 

Si el proxy no es "tuyo", no confiaría en el 'x-forwarded-for'encabezado porque puede ser falsificado.

alessioalex avatar Jun 01 '2012 11:06 alessioalex

Si bien la respuesta de @alessioalex funciona, hay otra forma, como se indica en la sección Express detrás de proxies de Express - guía .

  1. Agregue app.set('trust proxy', true)a su código de inicialización rápido.
  2. Cuando quieras obtener la ip del cliente remoto, utiliza req.ipo req.ipsde la forma habitual (como si no hubiera un proxy inverso)

Lectura opcional:

  • Utilice req.ipo req.ips. req.connection.remoteAddressno funciona con esta solución.
  • Hay más opciones 'trust proxy'disponibles si necesita algo más sofisticado que confiar en todo lo que se pasa en x-forwarded-forel encabezado (por ejemplo, cuando su proxy no elimina el encabezado x-forwarded-for preexistente de fuentes que no son de confianza). Consulte la guía vinculada para obtener más detalles.
  • Si su servidor proxy no completa x-forwarded-forel encabezado, existen dos posibilidades.
    1. El servidor proxy no transmite la información sobre dónde se encontraba originalmente la solicitud. En este caso, no habría forma de saber de dónde procede la solicitud. Primero debe modificar la configuración del servidor proxy.
      • Por ejemplo, si usa nginx como proxy inverso, es posible que deba agregar algo proxy_set_header X-Forwarded-For $remote_addr;a su configuración.
    2. El servidor proxy transmite la información sobre el origen de la solicitud de forma patentada (por ejemplo, un encabezado http personalizado). En tal caso, esta respuesta no funcionaría. Puede haber una forma personalizada de obtener esa información, pero primero es necesario comprender el mecanismo.
Haozhun avatar Jan 31 '2013 17:01 Haozhun