http - address - heroku panel
Obtener la dirección IP real del cliente en Heroku (3)
De Jacob, el Director de Seguridad de Heroku en ese momento:
El enrutador no sobrescribe
X-Forwarded-For
, pero sí garantiza que el origen real siempre será el último elemento de la lista.
Esto significa que, si accede a una aplicación Heroku de la forma habitual, solo verá su dirección IP en el encabezado X-Forwarded-For
:
$ curl http://httpbin.org/ip
{
"origin": "123.124.125.126",
}
Si intenta falsificar la IP, su supuesto origen se refleja, pero, críticamente, también lo es su IP real. Obviamente, esto es todo lo que necesitamos, por lo que hay una solución clara y segura para obtener la dirección IP del cliente en Heroku:
$ curl -H"X-Forwarded-For: 8.8.8.8" http://httpbin.org/ip
{
"origin": "8.8.8.8, 123.124.125.126"
}
Esto es todo lo contrario de lo que se describe en la Wikipedia , por cierto.
Implementación de PHP:
function getIpAddress() {
if (isset($_SERVER[''HTTP_X_FORWARDED_FOR''])) {
$ipAddresses = explode('','', $_SERVER[''HTTP_X_FORWARDED_FOR'']);
return trim(end($ipAddresses));
}
else {
return $_SERVER[''REMOTE_ADDR''];
}
}
En Heroku Cedar, quería obtener la IP del cliente. Primer intento:
ENV[''REMOTE_ADDR'']
Esto no funciona, por supuesto, porque todas las solicitudes se pasan a través de proxies. Entonces la alternativa era usar:
ENV[''HTTP_X_FORWARDED_FOR'']
Pero esto no es seguro, ¿verdad?
Si contiene solo un valor, tomo esto. Si contiene más de un valor (separados por comas), podría tomar el primero.
Pero, ¿y si alguien manipula este valor? No puedo confiar en ENV[''HTTP_X_FORWARDED_FOR'']
como pude con ENV[''REMOTE_ADDR'']
. Y tampoco hay una lista de proxies confiables que pueda usar.
Pero siempre debe haber alguna manera de obtener de manera confiable la dirección IP del cliente. ¿Conoces uno?
En sus documentos , Heroku describe que X-Forwarded-For
es "la dirección IP de origen del cliente que se conecta al enrutador Heroku".
Esto suena como si Heroku pudiera sobrescribir el X-Forwarded-For
con la IP remota de origen. Esto evitaría la suplantación, ¿verdad? ¿Alguien puede verificar esto?
Nunca se puede confiar realmente en la información que proviene del cliente. Es más una cuestión de en quién confías y cómo lo verificas. Incluso se puede influir en Heroku para que proporcione un valor HTTP_X_FORWARDED_FOR
incorrecto si tienen un error en su código o se piratean de alguna manera. Otra opción sería que alguna otra máquina Heroku se conecte a su servidor internamente y omitiendo su proxy por completo mientras REMOTE_ADDR
y / o HTTP_X_FORWARDED_FOR
.
La mejor respuesta aquí dependerá de lo que estás tratando de hacer. Si intenta verificar a sus clientes, un certificado del lado del cliente podría ser una solución más adecuada. Si todo lo que necesita para la IP es la ubicación geográfica, confiar en la entrada podría ser lo suficientemente bueno. En el peor de los casos, alguien falsificará la ubicación y obtendrá el contenido incorrecto ... Si tiene un caso de uso diferente, hay muchas otras soluciones entre esos dos extremos.
Trabajo en el departamento de soporte de Heroku y he pasado un tiempo discutiendo esto con nuestros ingenieros de enrutamiento. Quería publicar información adicional para aclarar algunas cosas sobre lo que está sucediendo aquí.
El ejemplo proporcionado en la respuesta anterior simplemente hizo que la IP del cliente se mostrara por última coincidencia y eso no está realmente garantizado. La razón por la que no fue el primero es porque la solicitud de origen afirmaba que se estaba reenviando para la IP especificada en el encabezado X-Forwarded-For
. Cuando el enrutador Heroku recibió la solicitud, solo anexó la IP que se conectaba directamente a la lista X-Forwarded-For
después de la que se había inyectado en la solicitud. Nuestro enrutador siempre agrega la IP que está conectada a AWS ELB frente a nuestra plataforma como la última IP de la lista. Esta IP podría ser la original (y en el caso donde solo hay una IP, casi con toda seguridad lo es), pero en el instante en que hay múltiples IPs encadenadas, todas las apuestas están desactivadas. La convención consiste siempre en agregar la IP más reciente de la cadena al final de la lista (que es lo que hacemos), pero en cualquier punto de la cadena esa cadena se puede modificar y se pueden insertar diferentes direcciones IP. Como tal, la única IP que es confiable (desde la perspectiva de nuestra plataforma) es la última IP de la lista.
Para ilustrar, digamos que alguien inicia una solicitud y agrega arbitrariamente 3 direcciones IP adicionales al encabezado X-Forwarded-For:
curl -H "X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4" http://www.google.com
Imagínese que el IP de esta máquina era 9.9.9.9 y que tenía que pasar por un proxy (por ejemplo, el proxy de todo el campus de una universidad). Digamos que el proxy tiene una IP de 2.2.2.2. Suponiendo que no estaba configurado para quitar encabezados X-Forwarded-For
(lo que probablemente no sería así), simplemente pasaría la IP 9.9.9.9 al final de la lista y pasaría la solicitud a Google. En este punto, el encabezado se vería así:
X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9
Esa solicitud pasará a través del punto final de Google, que agregará el IP del proxy de la universidad de 2.2.2.2, por lo que el encabezado finalmente se verá así en los registros de Google:
X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9,2.2.2.2
Entonces, ¿cuál es la IP del cliente? Es imposible decirlo desde el punto de vista de Google. En realidad, el IP del cliente es 9.9.9.9. El último IP que figura es 2.2.2.2 y el primero es 12.12.12.12. Todo lo que Google sabría es que la IP 2.2.2.2 es definitivamente correcta porque esa era la IP que en realidad estaba conectada a su servicio, pero no sabrían si ese fue el cliente inicial para la solicitud o no de los datos disponibles. De la misma manera, cuando solo hay una IP en este encabezado, esa es la IP que se conecta directamente a nuestro servicio, por lo que sabemos que es confiable.
Desde un punto de vista práctico, esta IP probablemente sea confiable la mayor parte del tiempo (porque la mayoría de la gente no se molestará en falsificar su IP). Desafortunadamente, es imposible evitar este tipo de falsificación y para cuando llega una solicitud al enrutador Heroku, es imposible para nosotros saber si las direcciones IP en una cadena X-Forwarded-For
han sido manipuladas o no.
Dejando a un lado todos los problemas de confiabilidad, estas cadenas IP siempre deben leerse de izquierda a derecha. La IP del cliente siempre debe ser la IP más a la izquierda.