Express.js: cómo obtener la dirección de un cliente remoto
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?
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.
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 .
- Agregue
app.set('trust proxy', true)
a su código de inicialización rápido. - Cuando quieras obtener la ip del cliente remoto, utiliza
req.ip
oreq.ips
de la forma habitual (como si no hubiera un proxy inverso)
Lectura opcional:
- Utilice
req.ip
oreq.ips
.req.connection.remoteAddress
no 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 enx-forwarded-for
el 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-for
el encabezado, existen dos posibilidades.- 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.
- Por ejemplo, si usa nginx como proxy inverso, es posible que deba agregar algo
- 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.
- 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.