수색…


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