$_SERVER["REMOTE_ADDR"] は、クライアント IP を取得するために PHP でよく使用されます。
(1) ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの IP アドレスであり、実際のクライアントの IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、$_SERVER["HTTP_X_FORWARDED_FOR"] を使用して読み取ります。
(2) ただし、クライアントが「透過プロキシ」を使用する場合に限り、$_SERVER["HTTP_X_FORWARDED_FOR"] の値はクライアントの実際の IP になります (マルチレイヤ プロキシの場合、この値はクライアントの実際の IP と複数の IP である可能性があります)。これは、プロキシ サーバーの IP アドレスをカンマ「,」で区切って構成されます。
(3) 「匿名プロキシ」および「偽プロキシ」の場合は、プロキシ サーバーの IP 値です(マルチレイヤ プロキシの場合、この値は、複数のプロキシ サーバーの IP を で区切って構成する場合があります)。カンマ「,」)。
(4) 「高匿名性プロキシ」の場合はNULL。
HTTPヘッダー情報のREMOTE_ADDRとHTTP_FORWARDED_FORの値について、クライアントの実IPが221.5.252.160であると仮定した場合の分析は以下の通りです。
1. プロキシサーバーを使用せずに、PHP を使用してクライアント IP を取得する方法:
2. 透過的プロキシサーバーの使用: 透過的プロキシ
3. 通常の匿名プロキシサーバーのPHPを使用してクライアントIPを取得する: 匿名プロキシ
4. 欺瞞的なプロキシサーバーの使用: プロキシを歪める
5. PHP と高匿名性プロキシ サーバーを使用してクライアント IP を取得する: 高匿名性プロキシ (エリート プロキシ)
HTTP_X_FORWARDED_FOR = 値がないか、表示されません。
PHP でクライアント IP を取得するときに注意すべきもう 1 つの点は、関数 getenv('HTTP_X_FORWARDED_FOR') または getenv('REMOTE_ADDR') を使用して上記のコードと同じ効果を達成できることです。ただし、getenv() は、IIS isapi モードで実行される PHP をサポートしていません。
REMOTE_ADDR は、クライアントがサーバーと「ハンドシェイク」するときの IP です。 「匿名プロキシ」が使用されている場合、REMOTE_ADDR にはプロキシ サーバーの IP が表示されます。
HTTP_CLIENT_IP は、プロキシ サーバーによって送信される HTTP ヘッダーです。 「スーパー匿名プロキシ」の場合は、値 none が返されます。同様に、REMOTE_ADDR はこのプロキシ サーバーの IP に置き換えられます。
$_SERVER['REMOTE_ADDR'] //アクセス (おそらくユーザー、おそらくプロキシ) IP
$_SERVER['HTTP_CLIENT_IP'] //エージェント側 (存在する可能性がありますが、偽造される可能性があります)
$_SERVER['HTTP_X_FORWARDED_FOR'] //ユーザーがプロキシとして使用している IP (存在する可能性もあれば、偽造される可能性もあります)
上記の状況に基づいて書かれた PHP コード:
IPアクセスが制限されているWebページにこの機能を適用すると、IPアクセスが制限されているセグメントのプロキシサーバーを経由しても他の人はそのページにアクセスできなくなります。
関数は以下に提供されます: // 関数 getIP() を定義します
function getIP(){global $ip;
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP") ;
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");else$ip = " Unknow ";
return $ip;}
// 使用法:
echo getIP();?>
getenv("REMOTE_ADDR") はクライアントの IP アドレスを取得するために使用されますが、クライアントがプロキシ サーバーを使用してアクセスする場合、この場合、取得されるのはプロキシ サーバーの IP アドレスであり、実際のクライアントの IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、getenv("HTTP_X_FORWARDED_FOR") を使用して読み取ります。
ただし、クライアントがプロキシサーバー経由でアクセスしない場合、getenv("HTTP_X_FORWARDED_FOR") で取得した値は空になります。
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
は、getenv("HTTP_X_FORWARDED_FOR") によって取得された値が空でない場合 (つまり、クライアントがプロキシ サーバーを使用している場合) を意味します。の場合、変数 $ip は getenv("HTTP_X_FORWARDED_FOR") によって取得される実際の IP 値と等しくなります。
上記の else if(getenv("HTTP_X_FORWARDED_FOR")) で取得した値が空の場合 (つまり、プロキシ サーバーが使用されていない場合)、次の $ip = getenv("HTTP_X_FORWARDED_FOR") 行のステートメントは実行されません。
この場合、クライアントがプロキシ サーバーを使用していないことが確認されているため、
else if(getenv("REMOTE_ADDR"))
が渡されます。
.X.XXX.XXX シリーズの IP、この関数は LAN ゲートウェイ出口の IP アドレスを取得します。訪問者がプロキシ サーバーを使用している場合、プロキシ サーバーの IP は取得されませんが、訪問者のゲートウェイの実際の IP が取得されます。 。 IP アクセスが制限されている Web ページにこの機能を適用すると、IP アクセスが制限されたセグメント内のプロキシ サーバーを経由しても、他のユーザーはそのページにアクセスできなくなります。関数は以下に提供されます: getenv("REMOTE_ADDR") は、クライアントの IP アドレスを取得するために使用されます。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの IP アドレスです。実際のクライアント IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、getenv("HTTP_X_FORWARDED_FOR") を使用して読み取ります。ただし、クライアントがプロキシサーバーを介してアクセスしない場合、getenv("HTTP_X_FORWARDED_FOR") で取得される値は空になります。 else if(getenv("HTTP_X_FORWARDED_FOR"))$ip = getenv("HTTP_X_FORWARDED_FOR"); は、getenv("HTTP_X_FORWARDED_FOR") によって取得された値が空でない場合 (つまり、クライアントがプロキシ サーバーを使用している場合)、変数 $ip は、getenv("HTTP_X_FORWARDED_FOR") によって取得される実際の IP 値と等しくなります。上記の else if(getenv("HTTP_X_FORWARDED_FOR")) によって取得された値が空の場合 (つまり、プロキシ サーバーが使用されていない場合)、次の $ip = getenv("HTTP_X_FORWARDED_FOR") 行のステートメントは実行されません。この場合、クライアントがプロキシ サーバーを使用していないことが確認されているため、else if(getenv("REMOTE_ADDR")) の 2 行ステートメントによって取得されるクライアントの IP アドレスも実際の IP アドレスです。