Функция для получения IP-адреса пользователя

Возможный дубликат:
Каков наиболее точный способ получения правильного IP-адреса пользователя в PHP?

Есть ли какая-либо лучшая функция в php для получения IP-адреса пользователя? это то, что я использую в данный момент

function GetIP() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return($ip); } 

Ну, ваша функция должна вести себя так, как ожидалось, но вот несколько советов:

 // lowercase first letter of functions. It is more standard for PHP function getIP() { // populate a local variable to avoid extra function calls. // NOTE: use of getenv is not as common as use of $_SERVER. // because of this use of $_SERVER is recommended, but // for consistency, I'll use getenv below $tmp = getenv("HTTP_CLIENT_IP"); // you DON'T want the HTTP_CLIENT_ID to equal unknown. That said, I don't // believe it ever will (same for all below) if ( $tmp && !strcasecmp( $tmp, "unknown")) return $tmp; $tmp = getenv("HTTP_X_FORWARDED_FOR"); if( $tmp && !strcasecmp( $tmp, "unknown")) return $tmp // no sense in testing SERVER after this. // $_SERVER[ 'REMOTE_ADDR' ] == gentenv( 'REMOTE_ADDR' ); $tmp = getenv("REMOTE_ADDR"); if($tmp && !strcasecmp($tmp, "unknown")) return $tmp; return("unknown"); } 

Адаптировано из этого ответа :

 function GetIP() { 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) === true) { foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } 

Проверяет наличие IP-адресов (по порядку) в:

  1. HTTP_CLIENT_IP
  2. HTTP_X_FORWARDED_FOR
  3. HTTP_X_FORWARDED
  4. HTTP_X_CLUSTER_CLIENT_IP
  5. HTTP_FORWARDED_FOR
  6. HTTP_FORWARDED
  7. REMOTE_ADDR

Помните, что единственным IP-адресом, которому вы можете доверять, является тот, который поступает из $_SERVER['REMOTE_ADDR'] .