PHP
Cómo detectar la dirección IP del cliente
Buscar..
Uso correcto de HTTP_X_FORWARDED_FOR
A la luz de las últimas vulnerabilidades de httpoxy , hay otra variable, que es ampliamente mal utilizada.
HTTP_X_FORWARDED_FOR
se usa a menudo para detectar la dirección IP del cliente, pero sin ninguna verificación adicional, esto puede llevar a problemas de seguridad, especialmente cuando esta IP se usa más adelante para la autenticación o en consultas SQL sin saneamiento.
La mayoría de los ejemplos de código disponibles ignoran el hecho de que HTTP_X_FORWARDED_FOR
puede considerarse realmente como información proporcionada por el propio cliente y, por lo tanto, no es una fuente confiable para detectar la dirección IP de los clientes. Algunas de las muestras agregan una advertencia sobre el posible uso indebido, pero aún no tienen ninguna verificación adicional en el propio código.
Así que aquí hay un ejemplo de la función escrita en PHP, cómo detectar la dirección IP de un cliente, si sabe que ese cliente puede estar detrás de un proxy y sabe que se puede confiar en este proxy. Si no conoces ningún proxy de confianza, puedes usar REMOTE_ADDR
function get_client_ip()
{
// Nothing to do without any reliable information
if (!isset($_SERVER['REMOTE_ADDR'])) {
return NULL;
}
// Header that is used by the trusted proxy to refer to
// the original IP
$proxy_header = "HTTP_X_FORWARDED_FOR";
// List of all the proxies that are known to handle 'proxy_header'
// in known, safe manner
$trusted_proxies = array("2001:db8::1", "192.168.50.1");
if (in_array($_SERVER['REMOTE_ADDR'], $trusted_proxies)) {
// Get IP of the client behind trusted proxy
if (array_key_exists($proxy_header, $_SERVER)) {
// Header can contain multiple IP-s of proxies that are passed through.
// Only the IP added by the last proxy (last IP in the list) can be trusted.
$client_ip = trim(end(explode(",", $_SERVER[$proxy_header])));
// Validate just in case
if (filter_var($client_ip, FILTER_VALIDATE_IP)) {
return $client_ip;
} else {
// Validation failed - beat the guy who configured the proxy or
// the guy who created the trusted proxy list?
// TODO: some error handling to notify about the need of punishment
}
}
}
// In all other cases, REMOTE_ADDR is the ONLY IP we can trust.
return $_SERVER['REMOTE_ADDR'];
}
print get_client_ip();