클라이언트의 IP 주소를 추출하는 데 사용할 수 있는 PHP의 "미리 정의된" $_SERVER 변수 에 제공되는 여러 배열 이름/값 쌍이 있습니다. 

웹 서버에서 검색된 IP 관련 $_SERVER 매개변수 중 일부는 클라이언트에 의해 HTTP 헤더 형태로 전달되므로 쉽게 스푸핑 될 수 있습니다 .

또한 일부 HTTP_X_FORWARD* 매개변수는 프록시 서버에 의해 채워질 것으로 예상되며 모든 프록시 서버가 모범적 사례를 따르지 않기 때문에 항상 존재하는 것은 아닙니다. 

$_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_X_FORWARDED_FOR 의 값은 프록시 서버에 의해 설정되며 여러 프록시가 관련된 경우 쉼표로 구분된 IP 주소 목록을 포함할 수 있습니다. $_SERVER 변수에 전달된 모든 HTTP_* 매개변수는 클라이언트 시스템에서 조작할 수 있으므로 신뢰할 수 없습니다. 


출처: http://www.webtrafficexchange.com/how-get-client-ip-address-php

0 댓글