1
2 // getenv() の使用例
3 $ip = getenv('REMOTE_ADDR');
4 // または単にスーパーグローバル ($_SERVER または $_ENV) を使用します5 $ip = $_SERVER['REMOTE_ADDR']
6 ?>
これはPHPの公式マニュアルに記載されている方法です。
したがって、より安全で正確な方法は、getenv 関数の使用をできるだけ避けることです。たとえば、次の関数を使用して IP 情報を取得できます:
01
02 関数 GetIP(){03 if (getenv("HTTP_CLIENT_IP")
04 && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
05 $ip = getenv("HTTP_CLIENT_IP");
06 else if (getenv("HTTP_X_FORWARDED_FOR")
07 && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
08 $ip = getenv("HTTP_X_FORWARDED_FOR");
09 else if (getenv("REMOTE_ADDR")10
11 $ip = getenv("REMOTE_ADDR");12 else if (isset($_SERVER['REMOTE_ADDR'])
13
14 && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))15 $ip = $_SERVER['REMOTE_ADDR']
他16個
17 $ip = "不明";
18 リターン ($ip)
19 }
20
21 $ip = GetIP();
22 エコー $ip23 ?>
このうち、HTTP_X_FORWARDED_FOR、HTTP_VIA、REMOTE_ADDRの違いは
1. プロキシサーバーを使用しない場合:REMOTE_ADDR = あなたのIP
HTTP_VIA = 値がないか、www.2cto.com が表示されません
HTTP_X_FORWARDED_FOR = 値がないか、表示されません
2. 透過プロキシサーバーの使用状況: 透過プロキシ
REMOTE_ADDR = 最後のプロキシ サーバー IP
HTTP_VIA = プロキシサーバーのIP
このタイプのプロキシ サーバーは依然としてあなたの情報を訪問者に転送するため、あなたの本当の身元を隠すという目的を達成することはできません。
REMOTE_ADDR = 最後のプロキシ サーバー IP
HTTP_VIA = プロキシサーバーのIP
HTTP_X_FORWARDED_FOR = プロキシ サーバー IP。複数のプロキシ サーバーを経由する場合、この値は 203.98.182.163、203.98.182.163、203.129.72.215 のようになります。
4. 欺瞞的なプロキシサーバーの使用: プロキシを歪める
REMOTE_ADDR = プロキシサーバーのIP
HTTP_VIA = プロキシサーバーのIP
HTTP_X_FORWARDED_FOR = ランダム IP。複数のプロキシ サーバーを経由する場合、この値は 203.98.182.163、203.98.182.163、203.129.72.215 のようになります。
5. 高匿名性プロキシサーバーの使用状況: 高匿名性プロキシ(エリートプロキシ)
REMOTE_ADDR = プロキシサーバーのIP
HTTP_VIA = 値がないか、表示されません
HTTP_X_FORWARDED_FOR = 値がないか、複数のプロキシ サーバーを経由する場合、この値は 203.98.182.163、203.98.182.163、203.129.72.215 のようになります。
プロキシ サーバーを使用してオブジェクトに直接アクセスしているのと同じように、すべての情報がプロキシ サーバーの情報で完全に置き換えられます。
関数 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'];
}その他{
$online_ip = $_SERVER['REMOTE_ADDR'];
}
$online_ip を返します;
}