Recherche…


Utilisation correcte de HTTP_X_FORWARDED_FOR

À la lumière des dernières vulnérabilités de httpoxy , il existe une autre variable, qui est largement mal utilisée.

HTTP_X_FORWARDED_FOR est souvent utilisé pour détecter l'adresse IP du client, mais sans vérification supplémentaire, cela peut entraîner des problèmes de sécurité, en particulier lorsque cette adresse IP est utilisée ultérieurement pour l'authentification ou dans des requêtes SQL sans désinfection.

La plupart des exemples de code disponibles ignorent le fait que HTTP_X_FORWARDED_FOR peut effectivement être considéré comme une information fournie par le client lui-même et n'est donc pas une source fiable pour détecter l'adresse IP des clients. Certains des échantillons ajoutent un avertissement au sujet d'une éventuelle mauvaise utilisation, mais ne contiennent toujours aucune vérification supplémentaire dans le code lui-même.

Donc, voici un exemple de fonction écrite en PHP, comment détecter une adresse IP client, si vous savez que le client peut être derrière un proxy et que vous savez que ce proxy peut être approuvé. Si vous ne connaissez aucun proxy approuvé, vous pouvez simplement utiliser 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow