특정 네트워크에서 클라이언트 IP 주소를 얻는 방법은 무엇입니까?

특정 네트워크에서 클라이언트 IP 주소를 얻는 방법은 무엇입니까?

클라이언트의 IP 주소를 필터링하는 조건이 있는데, 클라이언트의 IP 네트워크는 다음과 같습니다 1.1.0.0/17. 이 네트워크의 일부 클라이언트가 내 웹사이트에서 특별한 사용자로 필터링될 경우. 그리고 저는 웹 서비스 언어로 PHP를 사용합니다.

IP 1.1.4.24클라이언트가 데이터베이스에 자동으로 기록되는 경우 .

누군가 나에게 어떤 방법을 말해 줄 수 있습니까?

답변1

그래서 나는 당신이 PHP 솔루션을 찾고 있다고 가정합니까? 이 경우 다음과 같은 것이 필요합니다.

function get_ip_address() {
    // check for shared internet/ISP IP
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    }

    // check for IPs passing through proxies
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // check if multiple ips exist in var
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
            $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($iplist as $ip) {
                if (validate_ip($ip))
                    return $ip;
            }
        } else {
            if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
                return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
        return $_SERVER['HTTP_X_FORWARDED'];
    if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
        return $_SERVER['HTTP_FORWARDED_FOR'];
    if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
        return $_SERVER['HTTP_FORWARDED'];

    // return unreliable ip since all else failed
    return $_SERVER['REMOTE_ADDR'];
}

function validate_ip($ip) {
if (strtolower($ip) === 'unknown')
    return false;

// generate ipv4 network address
$ip = ip2long($ip);

// if the ip is set and not equivalent to 255.255.255.255
if ($ip !== false && $ip !== -1) {
    // make sure to get unsigned long representation of ip
    // due to discrepancies between 32 and 64 bit OSes and
    // signed numbers (ints default to signed in PHP)
    $ip = sprintf('%u', $ip);
    // do private network range checking
    if ($ip >= 0 && $ip <= 50331647) return false;
    if ($ip >= 167772160 && $ip <= 184549375) return false;
    if ($ip >= 2130706432 && $ip <= 2147483647) return false;
    if ($ip >= 2851995648 && $ip <= 2852061183) return false;
    if ($ip >= 2886729728 && $ip <= 2887778303) return false;
    if ($ip >= 3221225984 && $ip <= 3221226239) return false;
    if ($ip >= 3232235520 && $ip <= 3232301055) return false;
    if ($ip >= 4294967040) return false;
}
return true;
 }

이제 $ip = get_ip_address();만 호출하면 됩니다.

나는 이것이 무엇인지 당신에게 말해야합니다매우 위험함IP를 기반으로 사람들에게 액세스 권한을 부여합니다!

답변2

어떤 리소스를 사용할 수 있는지 잘 모르겠지만 로그인하는 사용자의 ID를 기반으로 이를 수행하는 장치가 있습니다. 예를 들어 Cisco ASA 방화벽에는 Microsoft에서 로그인 이벤트를 선택하는 ID 기능이 있습니다. Active Directory 서버를 통해 해당 사용자의 IP 주소를 방화벽에 알립니다. 그런 다음 IP가 아닌 사용자 이름을 기반으로 ACL을 작성합니다. 완벽하지는 않지만 작동합니다.

Cisco 신원 기반 방화벽:http://www.cisco.com/c/dam/en/us/products/coltral/security/asa-5500-series-next- Generation-firewalls/at_a_glance_c45-675579.pdf

이미 말했듯이 IP 주소만으로 필터링하는 것은 보안의 첫 번째 단계일 뿐입니다. 고정 IP를 설정하거나 IP를 스푸핑하는 것도 쉽습니다. 거기에도 몇 가지 인증 메커니즘이 필요할 것입니다.

관련 정보