PHPはクライアントIPを取得する

2941 ワード

<?php 
  // Example use of getenv()
  $ip = getenv('REMOTE_ADDR');
  // Or simply use a Superglobal ($_SERVER or $_ENV)
  $ip = $_SERVER['REMOTE_ADDR']; 
?>

これはPHP公式のmanualで提供されている方法です.
しかし,WebサーバAPIがASAPI(IIS)である場合,getenv関数は機能しない.この場合、getenvでユーザークライアントipを取得すると、誤ったipアドレスが得られます.
したがって、より安全で正確な方法はgetenv関数の使用をできるだけ避けることです.例えば、ip情報は以下の関数で取得できます.
<?php
	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);
	}

	$ip = GetIP();
	echo $ip;
?>

そのうちHTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDRの違いは
一、プロキシサーバーを使用していない場合:
      REMOTE_ADDR=IP HTTP_VIA=数値がないかHTTP_を表示しないX_FORWARDED_FOR=数値なしまたは非表示
二、透明プロキシサーバーを使用する場合:Transparent Proxies
      REMOTE_ADDR=最後のプロキシサーバIP HTTP_VIA=プロキシサーバIP HTTP_X_FORWARDED_FOR=実際のIPは、複数のプロキシサーバを通過する場合、この値は次のようになります:203.98.182.163, 203.98.182.163, 203.129.72.215.
このようなエージェント・サーバは、アクセス・オブジェクトに情報を転送しても、実際のアイデンティティを隠すことはできません.
三、一般匿名プロキシサーバーを使用する場合:Anonymous Proxies
      REMOTE_ADDR=最後のプロキシサーバIP HTTP_VIA=プロキシサーバIP HTTP_X_FORWARDED_FOR=プロキシサーバIPであり、複数のプロキシサーバを通過する場合、この値は次のようになる:203.98.182.163, 203.98.182.163, 203.129.72.215.
実際のIPは非表示ですが、プロキシ・サーバを使用してアクセスしていることがアクセス・オブジェクトに明らかになりました.
四、欺瞞エージェントサーバーを使用する場合:Distorting Proxies
      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を作成しました.
五、高匿名エージェントサーバーを使用する場合:High Anonymity Proxies(Elite proxies)
      REMOTE_ADDR=プロキシサーバIP HTTP_VIA=数値がないかHTTP_を表示しないX_FORWARDED_FOR=数値がない、または表示しない、複数のプロキシサーバを通過する場合、この値は次のようになります:203.98.182.163, 203.98.182.163, 203.129.72.215.
すべての情報をプロキシサーバの情報に置き換え、そのプロキシサーバを完全に使用してオブジェクトに直接アクセスするようにします.
function getip(){ if($_SERVER['HTTP_X_FORWARDED_FOR']){ $online_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }elseif($_SERVER['HTTP_CLIENT_IP']){ $online_ip = $_SERVER['HTTP_CLIENT_IP']; }else{ $online_ip = $_SERVER['REMOTE_ADDR']; } return $online_ip; }