>  기사  >  백엔드 개발  >  PHP에서 클라이언트 IP를 얻는 방법 이해

PHP에서 클라이언트 IP를 얻는 방법 이해

jacklove
jacklove원래의
2018-05-22 11:38:422144검색

이 문서에서는 PHP를 통해 클라이언트 IP를 얻는 방법을 설명합니다

IP를 얻는 기능은 다음과 같습니다.

function getIP() {
    $realip = ''; //设置默认值
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $realip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $realip = $_SERVER['REMOTE_ADDR'];
    }
    preg_match('/^((?:\d{1,3}\.){3}\d{1,3})/',$realip,$match);
        if($match && ipType($match[0]) == 'InterNet网地址'){
                return  $match[0];
        }else{
                return  false;
        }
}

//인터넷에서는 IP 주소 사용을 허용합니다

function ipType($ip) {
    $iplist = explode(".", $ip);
    if ($iplist[0] >= 224 && $iplist[0] <= 239)
                return &#39;多播&#39;;
        if ($iplist[0] >= 240 && $iplist[0] <= 255)
        return &#39;保留&#39;;
    if (preg_match(&#39;/^198\.51\.100/&#39;, $ip))
        return &#39;TEST-NET-2,文档和示例&#39;;
    if (preg_match(&#39;/^203\.0\.113/&#39;, $ip))
        return &#39;TEST-NET-3,文档和示例&#39;;
    if (preg_match(&#39;/^192\.(18|19)\./&#39;, $ip))
        return &#39;网络基准测试&#39;;
    if (preg_match(&#39;/^192\.168/&#39;, $ip))
        return &#39;专用网络[内部网]&#39;;
    if (preg_match(&#39;/^192\.88\.99/&#39;, $ip))
        return &#39;ipv6to4中继&#39;;
    if (preg_match(&#39;/^192\.0\.2\./&#39;, $ip))
        return &#39;TEST-NET-1,文档和示例&#39;;
    if (preg_match(&#39;/^192\.0\.0\./&#39;, $ip))
        return &#39;保留(IANA)&#39;;
    if (preg_match(&#39;/^192\.0\.0\./&#39;, $ip))
        return &#39;保留(IANA)&#39;;
    if ($iplist[0] == 172 && $iplist[1] <= 31 && $iplist[1] >= 16)
        return &#39;专用网络[内部网]&#39;;
    if ($iplist[0] == 169 && $iplist[1] == 254)
        return &#39;链路本地&#39;;
    if ($iplist[0] == 127)
        return &#39;环回地址&#39;;
    if ($iplist[0] == 10)
        return &#39;专用网络[内部网]&#39;;
    if ($iplist[0] == 0)
        return &#39;本网络(仅作为源地址时合法)&#39;;
    return &#39;InterNet网地址&#39;;
}

The 인터넷에서 IP를 얻는 일반적인 함수는 다음과 같습니다.

public function get_real_ip() {
    static $realip;
    if (isset($_SERVER)) {
        if (isset($_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;])) {
            $realip = $_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;];
        } else if (isset($_SERVER[&#39;HTTP_CLIENT_IP&#39;])) {
            $realip = $_SERVER[&#39;HTTP_CLIENT_IP&#39;];
        } else {
            $realip = $_SERVER[&#39;REMOTE_ADDR&#39;];
        }
    } else {
        if (getenv(&#39;HTTP_X_FORWARDED_FOR&#39;)) {
            $realip = getenv(&#39;HTTP_X_FORWARDED_FOR&#39;);
        } else if (getenv(&#39;HTTP_CLIENT_IP&#39;)) {
            $realip = getenv(&#39;HTTP_CLIENT_IP&#39;);
        } else {
            $realip = getenv(&#39;REMOTE_ADDR&#39;);
        }
    }
    return $realip;
}

'REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP'의 차이점은 무엇인가요?

1.'REMOTE_ADDR'은 원격 IP이며, 기본값은 클라이언트 IP인 tcp 연결입니다. 클라이언트 IP만 서버에 직접 연결해 주는 것이 가장 정확하고 확실하다고 할 수 있습니다. 상대방이 프록시 서버를 통해 인터넷에 접속하면 발견됩니다. 얻은 것은 프록시 서버 IP입니다.

예: a->b(proxy)->c, c가 'REMOTE_ADDR'을 전달하면 b의 IP만 가져올 수 있고 a의 IP는 가져올 수 없습니다.

2. 대규모 네트워크에서 원래 사용자 IP 또는 프록시 IP 주소를 얻기 위해 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP'. HTTP 프로토콜을 확장합니다. 엔터티 헤더가 정의됩니다.

HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 모든 IP는 ","로 구분됩니다. HTTP_CLIENT_IP 고급 익명 프록시에서는 프록시 서버 IP를 나타냅니다. http 프로토콜은 엔터티 헤더를 확장하고 이 값을 수신 측에서 신뢰하므로 수신 측에서 규칙 형식에 따라 이를 입력한다고 신뢰합니다. 다음은 x_forword_for의 예를 사용하여 일반적인 상황에서 이 값이 프로세스를 변경합니다.

위험 지점:

이러한 변수는 http 요청에서 나옵니다: x-forword-for 필드 및 client-ip 필드. 물론 일반 프록시 서버는 rfc 사양에 따라 이러한 값을 전달합니다. 그런데 x-forword-for 값을 사용자가 직접 구성해서 사용자에게 보내면 어떤 값이든 쓸 수 있는 필드가 있는 것과 같습니다. 그리고 서버는 데이터베이스를 직접 읽거나 쓰거나 표시합니다. 이는 입력에 대한 필터링 및 테스트 없이 데이터 소스를 작동한 일반적인 결과와 마찬가지로 위험을 가져올 것입니다.

위 getip 기능의 경우:

클라이언트가 마음대로 IP를 위조할 수 있고 어떤 형식으로든 IP를 전달할 수 있다는 점은 제외합니다. 첫째, 특정 페이지를 설정하고 IP 제한을 적용하는 경우 두 가지 주요 문제가 발생합니다. 상대방은 쉽게 IP를 변경하고 지속적으로 페이지를 요청할 수 있습니다. 둘째, 이러한 데이터를 직접적으로 활용하게 되면 SQL 등록, 크로스 사이트 공격 등의 취약점이 발생하게 됩니다. 첫 번째는 해당 업무에 대한 제한을 설정할 수 있으며, IP 제한은 사용하지 않는 것이 가장 좋습니다. 두 번째로 이러한 유형은 엄청난 사이버 위험을 가져올 수 있습니다. 우리는 그것을 바로잡아야 합니다.

이 글에서는 PHP를 통해 클라이언트 IP를 얻는 방법에 대해 설명합니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 참고하세요.

관련 추천:

php에서 Session 사용에 대한 자세한 설명

php에서 die(),exit(), return의 차이점 소개

on 조건과 where 조건의 차이점 SQL

위 내용은 PHP에서 클라이언트 IP를 얻는 방법 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.