문제

PHP에서 IP 주소를 얻는 더 좋은 방법은 무엇입니까?

getenv('REMOTE_ADDR'); 

또는,

$_SERVER['REMOTE_ADDR'];

둘 사이의 차이점을 알려주세요.

도움이 되었습니까?

해결책

getEnv ()는 모든 환경 변수에 액세스하는 데 사용될 수 있습니다 (PHP는 스크립트의 환경 변수로 remote_addr을 간단히 등록), $ _server를 사용하면 $ _server SuperGlobal의 내용에만 액세스 할 수 있습니다.

일반적인 접근법은 실제로 $ _server를 사용하는 것이지만 실제로는 기능별로 차이를 만들지는 않습니다.

다른 팁

$ _Server는 PHP 변수로 내장되어 있으며 GetEnv ()는 값을 환경 (아마도 Apache/II)에 묻습니다.

IP를 얻는 가장 좋은 방법은 다음과 같습니다.

$ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : getenv('REMOTE_ADDR');

그러나이 두 변수 사이에 차이가 있는지 의심 스럽습니다 ... HM.

$ _server [ 'remote_addr']를 사용하는 것이 더 나을 것입니다. 서버 간의 비 호환성을 방지합니다.

tho 전화 사이에는 차이가 없습니다. 보시다시피 PHP 매뉴얼 동일한 예에서 두 방법을 모두 사용하십시오. $ _server enabled와 같은 글로벌 변수가없는 경우가 있으며 GetEnv ()를 사용해야합니다. 내 경험상 나는 글로벌 변수가 장애가있는 서버를 본 적이 없다.

와 함께 $_SERVER['REMOTE_ADDR'] 원격 요청이 발생할 때 설정된 $ _server [] 배열에 액세스하여 글로벌 변수를 직접 읽습니다.

$ _server 헤더, 경로 및 스크립트 위치와 같은 정보가 포함 된 배열입니다. 이 배열의 항목은 웹 서버에 의해 생성됩니다. 모든 웹 서버가 이들 중 어느 것도 제공 할 것이라는 보장은 없습니다. 서버는 일부를 생략하거나 여기에 나열되지 않은 다른 것을 제공 할 수 있습니다. 즉, 이러한 변수 중 다수가»CGI 1.1 사양에서 설명되므로이를 기대할 수 있어야합니다.

GetEnv () 함수는 모든 환경 변수에 대한 액세스 관련 값을 얻습니다!

두 경우 모두 동일한 값과 동일한 변수에 액세스하지만 $ _Server는 PHP Superglobal 변수의 빌드입니다. 대신 getenv ()는 현재 환경에서 정의 된 변수의 값을 얻습니다!

이 경우 Superglobal 변수의 사용이 IP 주소를 얻는 가장 좋은 방법이라고 생각합니다!

이 게시물은 약간 날짜가 많기 때문에이 게시물은 원래는 더 나은 요청 IP를 얻는 방법. 원래 게시물에 제공된 선택 중 하나는 아니지만 이것은 더 나은 방법입니다.

이 접근법은 편리한 휴대 성을 위해 작은 기능 라이브러리를 사용합니다.

// Function to sanitize IP string
function sanitize_ip($string){
  $string = trim($string); 
  $string = strip_tags($string);
  $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
  $string = str_replace('\n', '', $string);
  $string = trim($string); 
  return $string;
}

// Function to evaluate HTTP headers for IP
function evaluate_ip(){
  $ip_keys =
    array(
      'HTTP_CF_CONNECTING_IP',  'HTTP_CLIENT_IP',            'HTTP_X_FORWARDED_FOR',
      'HTTP_X_FORWARDED',       'HTTP_X_CLUSTER_CLIENT_IP',  'HTTP_X_REAL_IP',
      'HTTP_X_COMING_FROM',     'HTTP_PROXY_CONNECTION',     'HTTP_FORWARDED_FOR',
      'HTTP_FORWARDED',         'HTTP_COMING_FROM',          'HTTP_VIA',
      'REMOTE_ADDR'
    );
  foreach ($ip_keys as $key){
    if (array_key_exists($key, $_SERVER) === true){
      foreach (explode(',', $_SERVER[$key]) as $ip){
        $ip = trim($ip);
        $ip = normalize_ip($ip);
        if (validate_ip($ip)) return $ip;
      }
    }
  }
  // Build error response HTML
  $msg =
    '<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
      ERROR:&nbsp;<span style="color:#ffc107">Invalid IP Address</span>
    </div>';
  echo $msg;
  exit;
}

// Function to normalize IPv4 and IPv6 addresses with port
function normalize_ip($ip){
  // IPv4 with port (e.g., 123.123.123.123:80)
  if (strpos($ip, ':') !== false && substr_count($ip, '.') == 3 && strpos($ip, '[') === false){
    $ip = explode(':', $ip);
    $ip = $ip[0];
  }
  // IPv6 with port (e.g., [::1]:80)
  else {
    $ip = explode(']', $ip);
    $ip = ltrim($ip[0], '[');
  }
  return $ip;
}

// Function to validate IP address
function validate_ip($ip){
  $options  = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
  $filtered = filter_var($ip, FILTER_VALIDATE_IP, $options);
  if (!$filtered || empty($filtered)){
    if (preg_match("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip)){
      return $ip; // IPv4
    }
    elseif (preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/", $ip)){
      return $ip; // IPv6
    }
    // Build error response HTML
    $msg =
      '<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
        ERROR:&nbsp;<span style="color:#ffc107">Invalid IP Address</span>
      </div>';
    echo $msg;
    exit;
  }
  return $filtered;
}

function get_ip(){
  $ip = evaluate_ip();
  if (preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $ip, $ip_match)){
    $ip = $ip_match[1];
  }
  return sanitize_ip($ip);
}


// To Use
$ip = get_ip();

//

이것이 2018 년에 누군가가 도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top