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();


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow