php
PHP - 클라이언트 IP 주소를 얻는 방법
클라이언트의 IP 주소를 추출하는 데 사용할 수 있는 PHP의 "미리 정의된" $_SERVER 변수 에 제공되는 여러 배열 이름/값 쌍이 있습니다.
웹 서버에서 검색된 IP 관련 $_SERVER 매개변수 중 일부는 클라이언트에 의해 HTTP 헤더 형태로 전달되므로 쉽게 스푸핑 될 수 있습니다 .
또한 일부 HTTP_X_FORWARD* 매개변수는 프록시 서버에 의해 채워질 것으로 예상되며 모든 프록시 서버가 모범적 사례를 따르지 않기 때문에 항상 존재하는 것은 아닙니다.
HTTP_X_FORWARDED_FOR 의 값은 프록시 서버에 의해 설정되며 여러 프록시가 관련된 경우 쉼표로 구분된 IP 주소 목록을 포함할 수 있습니다. $_SERVER 변수에 전달된 모든 HTTP_* 매개변수는 클라이언트 시스템에서 조작할 수 있으므로 신뢰할 수 없습니다.
$_SERVER 변수에서 가장 신뢰할 수 있는 IP 주소는 REMOTE_ADDR 이며 아래에 언급된 다른 모든 주소는 원격 클라이언트가 쉽게 스푸핑할 수 있습니다.
따라서 신뢰할 수 없는 방문자(예: 인터넷 사용자)를 상대하는 경우 $_SERVER['REMOTE_ADDR'] 를 사용하고 원격 시스템의 IP 주소를 얻어야 합니다.
프록시에 의해 숨겨진 클라이언트의 실제 IP 주소를 얻지 못할 수도 있지만 적어도 프록시 서버의 IP 주소는 얻을 수 있습니다.
REMOTE_ADDR 도 고도로 숙련된 해커에 의해 스푸핑될 수 있지만 실제 IP 주소를 위조하려면 훨씬 더 고급 기술이 필요합니다.
외부 네트워크 인터페이스없이 웹 서버가 제대로 구성되지 않은 경우 REMOTE_ADDR 에 대해 빈값을 얻을 수도 있지만 이는 정상이 아닙니다.
클라이언트를 신뢰할 수 있다면 아래 코드를 사용하여 프록시에 숨겨진 클라이언트의 IP 주소를 추출할 수 있습니다.
<?php
function getRemoteIpAddress() {
$keys = array(
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR');
foreach ($keys as $key) {
if (array_key_exists($key, $_SERVER)) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP,
FILTER_FLAG_NO_PRIV_RANGE |
FILTER_FLAG_NO_RES_RANGE) !== false){
return $ip;
}
}
}
}
}
?>
출처: http://www.webtrafficexchange.com/how-get-client-ip-address-php
0 댓글