Поиск…


Правильное использование HTTP_X_FORWARDED_FOR

В свете последних уязвимостей httpoxy существует еще одна переменная, которая широко используется неправильно.

HTTP_X_FORWARDED_FOR часто используется для обнаружения IP-адреса клиента, но без каких-либо дополнительных проверок это может привести к проблемам безопасности, особенно если этот IP-адрес впоследствии используется для аутентификации или SQL-запросов без дезинфекции.

Большинство доступных образцов кода игнорируют тот факт, что HTTP_X_FORWARDED_FOR может фактически рассматриваться как информация, предоставленная самим клиентом и, следовательно , не является надежным источником для обнаружения IP-адресов клиентов. В некоторых примерах добавляется предупреждение о возможном неправильном использовании, но по-прежнему отсутствует какая-либо дополнительная проверка самого кода.

Итак, вот пример функции, написанной на PHP, как определить IP-адрес клиента, если вы знаете, что клиент может находиться за прокси-сервером, и вы знаете, что этому доверенному лицу можно доверять. Если вы не знаете доверенных доверенных лиц, вы можете просто использовать 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow