>  기사  >  백엔드 개발  >  PHP를 사용하여 클라이언트 및 서버 IP 얻기

PHP를 사용하여 클라이언트 및 서버 IP 얻기

王林
王林앞으로
2019-08-19 16:01:145707검색

1. PHP가 클라이언트 IP를 얻습니다

PHP가 클라이언트 IP를 얻을 때 $_SERVER["REMOTE_ADDR"]가 자주 사용됩니다. 그러나 클라이언트가 프록시 서버를 사용하여 액세스하는 경우 실제 클라이언트 IP 주소가 아닌 프록시 서버의 IP 주소를 얻습니다. 프록시 서버를 통해 클라이언트의 실제 IP 주소를 얻으려면 $_SERVER["HTTP_X_FORWARDED_FOR"]를 사용하여 읽으십시오.

그러나 클라이언트가 "투명 프록시"를 사용하는 경우에만 $_SERVER["HTTP_X_FORWARDED_FOR"] 값이 클라이언트의 실제 IP입니다(다층 프록시인 경우 이 값은 클라이언트의 실제 IP일 수 있으며 여러 프록시 서버의 IP(쉼표 ","로 구분), "익명 프록시" 및 "사기성 프록시"의 경우 프록시 서버의 IP 값입니다(다층 프록시인 경우 이 값은 쉼표(",")로 구분된 IP로 구성된 여러 프록시 서버로 구성됩니다. "고익명성 프록시"의 경우 빈 값입니다.

REMOTE_ADDR은 클라이언트가 서버와 "핸드셰이크"할 때의 IP입니다. "익명 프록시"가 사용되는 경우 REMOTE_ADDR은 프록시 서버의 IP를 표시합니다.
HTTP_CLIENT_IP는 프록시 서버가 보낸 HTTP 헤더입니다. "수퍼 익명 프록시"인 경우 없음 값이 반환됩니다. 마찬가지로 REMOTE_ADDR은 이 프록시 서버의 IP로 대체됩니다.

$_SERVER['REMOTE_ADDR']; //접속자 IP(사용자, 프록시 서버 또는 역방향 프록시 서버일 수 있음)
$_SERVER['HTTP_CLIENT_IP'] //에이전트 측 IP(존재할 수 있음) 위조될 수 있음) 표준이 되지 않았으며 모든 서버에서 구현되지 않을 수 있습니다.
$_SERVER['HTTP_X_FORWARDED_FOR']; //사용자가 프록시로 사용하는 IP(존재할 수도 있고 위조될 수도 있음) HTTP 프록시 이후 클라이언트 IP 주소를 식별하는 데 사용되는 표준 정의가 있습니다. , 프록시2. 자세한 설명은 http://zh.wikipedia.org/wiki/X-Forwarded-For를 참조하세요.

세 값의 차이 ​​​​는 다음과 같습니다.

1. 프록시 서버를 사용하지 않는 경우:

REMOTE_ADDR = 귀하의 IP
HTTP_VIA = 값이 없거나 표시되지 않음
HTTP_X_FORWARDED_FOR = 값이 없거나 없음 표시

2. 사용 투명 프록시 서버의 경우: 투명 프록시

REMOTE_ADDR = 마지막 프록시 서버 IP
HTTP_VIA = 프록시 서버 IP
HTTP_X_FORWARDED_FOR = 실제 IP, 여러 프록시 서버를 통과할 때 이 값은 비슷합니다. 203.98.182.163, 203.98.182.163, 203.129.72.215.

이 유형의 프록시 서버는 여전히 귀하의 정보를 방문자에게 전달하므로 귀하의 실제 신원을 숨기려는 목적을 달성할 수 없습니다.

3. 일반 익명 프록시 서버를 사용하는 상황: 익명 프록시

REMOTE_ADDR = 마지막 프록시 서버 IP
HTTP_VIA = 프록시 서버 IP
HTTP_X_FORWARDED_FOR = 프록시 서버 IP와 유사합니다. 다음: 203.98.182.163, 203.98.182.163, 203.129.72.215.

실제 IP를 숨기되 방문자에게 액세스하기 위해 프록시 서버를 사용하고 있다는 사실을 공개하세요.

4. 거짓 프록시 서버를 사용하는 상황: 왜곡된 프록시

REMOTE_ADDR = 프록시 서버 IP
HTTP_VIA = 프록시 서버 IP
HTTP_X_FORWARDED_FOR = 임의 IP를 통과할 때 이 값은 다음과 유사합니다. : 203.98.182.163, 203.98.182.163, 203.129.72.215.

방문하는 사람에게 프록시 서버를 사용하고 있다고 알리고 실제 IP 대신 가짜 임의 IP를 만들어 스푸핑하세요.

5. 높은 익명성 프록시 서버를 사용하는 경우: 높은 익명성 프록시(엘리트 프록시)

REMOTE_ADDR = 프록시 서버 IP
HTTP_VIA = 값 없음 또는 표시 없음
HTTP_X_FORWARDED_FOR = 여러 프록시 서버를 통해 값 없음 또는 표시 없음 값은 203.98.182.163, 203.98.182.163, 203.129.72.215와 유사합니다.

프록시 서버를 사용하여 객체에 직접 액세스하는 것처럼 모든 정보를 프록시 서버의 정보로 완전히 대체합니다.

샘플 코드:

//获取用户IP, 定义一个函数getIP()
function getClientIP(){
if (getenv("HTTP_CLIENT_IP")) {
	$ip = getenv("HTTP_CLIENT_IP");
}elseif(getenv("HTTP_X_FORWARDED_FOR")) {
	$ip = getenv("HTTP_X_FORWARDED_FOR");
}elseif(getenv("REMOTE_ADDR")) {
$ip = getenv("REMOTE_ADDR");
	else $ip = "Unknow";
}
return $ip;
}
或者
function getClientIp() {
	$ip = 'unknow';
    foreach (array(
                'HTTP_CLIENT_IP',
                'HTTP_X_FORWARDED_FOR',
                'HTTP_X_FORWARDED',
                'HTTP_X_CLUSTER_CLIENT_IP',
                'HTTP_FORWARDED_FOR',
                'HTTP_FORWARDED',
                'REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                //会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤
                //也可以修改成正则验证IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
    }
    return $ip;
}

2.php 서버 측 IP 가져오기

서버 측 IP 관련 변수
a. $_SERVER["SERVER_NAME"]를 얻으려면 gethostbyname() 함수를 사용해야 합니다. 이 변수는 서버측과 클라이언트측 모두에 올바르게 표시됩니다.

b. $_SERVER["SERVER_ADDR"], 서버 측에서 테스트됨: 127.0.0.1(httpd.conf의 BindAddress 설정 값과 관련됨) 클라이언트의 테스트 결과가 정확합니다.

/**
* 获取服务器端IP地址
 * @return string
 */
function getServerIp() { 
    if (isset($_SERVER)) { 
        if($_SERVER['SERVER_ADDR']) {
            $server_ip = $_SERVER['SERVER_ADDR']; 
        } else { 
            $server_ip = $_SERVER['LOCAL_ADDR']; 
        } 
    } else { 
        $server_ip = getenv('SERVER_ADDR');
    } 
    return $server_ip; 
}
或者
function getServerIP(){    
    return gethostbyname($_SERVER["SERVER_NAME"]);    
}

더 많은 관련 질문을 보려면 PHP 중국어 웹사이트 관련 질문 튜토리얼을 방문하세요: https://www.php.cn/

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

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제