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 중국어 웹사이트의 기타 관련 기사를 참조하세요!