Suche…


Ordnungsgemäße Verwendung von HTTP_X_FORWARDED_FOR

In Anbetracht der neuesten httpoxy- Schwachstellen gibt es eine weitere Variable, die häufig missbraucht wird.

HTTP_X_FORWARDED_FOR wird häufig zum Erkennen der Client-IP-Adresse verwendet. Dies kann jedoch ohne zusätzliche Prüfungen zu Sicherheitsproblemen führen, insbesondere wenn diese IP-Adresse später zur Authentifizierung oder in SQL-Abfragen ohne Bereinigung verwendet wird.

Die meisten der verfügbaren Codebeispiele ignorieren die Tatsache, dass HTTP_X_FORWARDED_FOR tatsächlich als vom Client selbst bereitgestellte Informationen betrachtet werden kann und daher keine zuverlässige Quelle zum Erkennen der IP-Adresse von Clients ist. In einigen Beispielen wird zwar eine Warnung vor möglichem Missbrauch hinzugefügt, der Code selbst wird jedoch noch nicht überprüft.

Hier ist ein Beispiel für eine in PHP geschriebene Funktion, wie Sie eine Client-IP-Adresse erkennen können, wenn Sie wissen, dass sich der Client hinter einem Proxy befindet und Sie wissen, dass dieser Proxy vertrauenswürdig ist. Wenn Sie keine vertrauenswürdigen Proxys kennen, können Sie einfach 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow