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 del usuario real o hay una mejor manera? ¿Y qué hay de los poderes?
node.js
express
ip
ip-address
Erik
fuente
fuente
Respuestas:
Si está ejecutando detrás de un proxy como NGiNX o lo que tiene, solo entonces debe verificar 'x-forwards-for':
Si el proxy no es 'tuyo', no confiaría en el encabezado 'x-forwards-for', porque puede ser falsificado.
fuente
proxy_set_header X-Forwarded-For $remote_addr;
en su configuración nginx en caso de que esté utilizando su propio proxy inverso.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
obtener la IP del cliente.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 .
app.set('trust proxy', true)
a su código de inicialización express.req.ip
oreq.ips
de la manera habitual (como si no hubiera un proxy inverso)Lectura opcional:
req.ip
oreq.ips
.req.connection.remoteAddress
No funciona con esta solución.'trust proxy'
disponibles si necesita algo más sofisticado que confiar en todo lo que se pasa en elx-forwarded-for
encabezado (por ejemplo, cuando su proxy no elimina el encabezado x-forward-for preexistente de fuentes no confiables). Consulte la guía vinculada para más detalles.x-forwarded-for
encabezado, hay dos posibilidades.proxy_set_header X-Forwarded-For $remote_addr;
a su configuración.fuente
app.enable('trust proxy')
también funciona para usarreq.ip
. Excepto que consigo el puerto1.2.3.4:56789
. Para despojarme, lo hagovar ip = req.ip.split(':')[0]
En
nginx.conf
archivo:proxy_set_header X-Real-IP $remote_addr;
En el
node.js
archivo del servidor:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
tenga en cuenta que expresa encabezados en minúsculas
fuente
req.headers['x-real-ip']
incluso en elnginx.conf
encabezado se establece con letras mayúsculas.Particularmente para el nodo, la documentación para el componente del servidor http, bajo conexión de evento dice:
Entonces, eso significa que
request.connection
es un socket y de acuerdo con la documentación, de hecho, hay un atributo socket.remoteAddress que de acuerdo con la documentación es:Bajo express, el objeto de solicitud también es una instancia del objeto de solicitud http Node, por lo que este enfoque aún debería funcionar.
Sin embargo, en Express.js la solicitud ya tiene dos atributos: req.ip y req.ips
Vale la pena mencionar que, según tengo entendido, el Express
req.ip
es un mejor enfoque quereq.connection.remoteAddress
, ya quereq.ip
contiene la IP del cliente real (siempre que el proxy de confianza esté habilitado en express), mientras que el otro puede contener la dirección IP del proxy (si hay uno).Esa es la razón por la cual la respuesta actualmente aceptada sugiere:
El
req.headers['x-forwarded-for']
será el equivalente de expressreq.ip
.fuente
app.set('trust proxy', true)
req.ip
oreq.ips
de la manera habitualfuente
Esta es solo información adicional para esta respuesta .
Si está utilizando
nginx
, agregaríaproxy_set_header X-Real-IP $remote_addr;
al bloque de ubicación del sitio./etc/nginx/sites-available/www.example.com
por ejemplo. Aquí hay un ejemplo de bloque de servidor.Después de reiniciar
nginx
, podrá acceder a la IP en sus rutasnode
/express
aplicación conreq.headers['x-real-ip'] || req.connection.remoteAddress;
fuente
Según Express detrás de los proxies , se
req.ip
ha tenido en cuenta el proxy inverso si se ha configuradotrust proxy
correctamente. Por lo tanto, es mejor que elreq.connection.remoteAddress
que se obtiene de la capa de red y desconoce el proxy.fuente
Escribí un paquete para ese propósito. Puede usarlo como middleware express. Mi paquete se publica aquí: https://www.npmjs.com/package/express-ip
Puede instalar el módulo usando
Uso
fuente
Sé que esta pregunta ha sido respondida, pero así es como hice que la mía funcione.
fuente
Si está bien con la biblioteca de terceros. Puede verificar request-ip .
Puedes usarlo es por
El código fuente es bastante largo, así que no lo copiaré aquí, puedes consultarlo en https://github.com/pbojinov/request-ip/blob/master/src/index.js
Básicamente,
Divulgar: no estoy asociado con la biblioteca.
fuente
Esto funcionó para mí mejor que el resto. Mis sitios están detrás de CloudFlare y parecía requerirlo
cf-connecting-ip
.No probé Express detrás de proxies ya que no dijo nada sobre este
cf-connecting-ip
encabezado.fuente
Con soporte de might-flare, nginx y x-real-ip
fuente
En mi caso, similar a esta solución, terminé usando el siguiente enfoque de x-forward-for :
x-forwarded-for
El encabezado seguirá agregando la ruta de la IP desde el origen hasta el servidor de destino final, por lo tanto, si necesita recuperar la IP del cliente de origen, este sería el primer elemento de la matriz.fuente
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
fuente
ip = ip.split(':').pop();
será difícil en este caso si la ip normal, es decir, 127.0.0.1 vendrá, todavía podrá darle ip.El objeto de encabezado tiene todo lo que necesita, solo haga esto:
fuente
Poniendo todo junto con la solución witk @kakopappa más el
morgan
registro de la dirección IP del cliente:fuente