PHP がクライアント IP
を取得するいくつかの状況を分析します。
PHP がクライアント IP を取得する状況は、プロキシ サーバーが使用されない状況、透過的プロキシ サーバーが使用される状況、一般的な匿名プロキシ サーバーが使用される状況、欺瞞的なプロキシ サーバーが使用される状況、および匿名性の高いプロキシ サーバーが使用される状況。
この記事では、PHP がクライアント IP を取得するいくつかの状況の分析を詳しく紹介します。 PHP を使用して取得する IP は、クライアントの実際の IP である場合もあれば、プロキシ サーバーの IP である場合もあります。また、IP 値をまったく取得できない場合もあります。
$_SERVER["REMOTE_ADDR"] は、クライアント IP を取得するために PHP でよく使用されます。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの IP アドレスであり、実際のクライアントの IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、$_SERVER["HTTP_X_FORWARDED_FOR"] を使用して読み取ります。
ただし、クライアントが「透過プロキシ」を使用する場合に限り、$_SERVER["HTTP_X_FORWARDED_FOR"] の値はクライアントの実際の IP になります (マルチレイヤ プロキシの場合、この値はクライアントの実際の IP)IP と複数のプロキシ サーバーの IP をカンマ「,」で区切って)、「匿名プロキシ」および「偽プロキシ」の場合はプロキシ サーバーの IP 値(マルチレイヤ プロキシの場合、この値は複数のプロキシ サーバーの IP をカンマ「,」で区切って構成することができます。「高匿名性プロキシ」の場合は null 値になります。
HTTP ヘッダー情報の REMOTE_ADDR と HTTP_FORWARDED_FOR の値については、クライアントの実際の IP が 221.5.252.160 であると仮定して、以下に詳しく説明します。
1. PHP の取得。プロキシ サーバーを使用しない場合 クライアント IP の状況:
REMOTE_ADDR = クライアント IP
HTTP_X_FORWARDED_FOR = 値がない、または表示されません
2. 透過的プロキシ サーバーを使用する場合: 透過的プロキシ
REMOTE_ADDR = 最後のプロキシ サーバー IP
HTTP_X_FORWARDED_FOR = クライアントの実際の IP (複数のプロキシ サーバーを経由する場合、この値は同様です: 221.5.252.160、203.98.182.163、203.129.72.215)
このタイプのプロキシ サーバーは依然としてクライアントの実際の IP をアクセス オブジェクトに送信するため、本当の身元を隠すという目的を達成できません。
3. 通常の匿名プロキシ サーバー PHP を使用してクライアント IP を取得します。 匿名プロキシ
REMOTE_ADDR = 最後のプロキシ サーバー IP
HTTP_X_FORWARDED_FOR = プロキシ サーバー IP (複数使用時以降)プロキシ サーバーの場合、この値は同様です: 203.98.182.163、203.98.182.163、203.129.72.215)
この場合、クライアントの実際の IP は隠されていますが、クライアントはアクセス オブジェクトに対して明らかにされます。クライアントはプロキシ サーバーを使用してアクセスしています。
IV. プロキシの歪み
REMOTE_ADDR = プロキシ サーバー IP
HTTP_X_FORWARDED_FOR = ランダム IP (複数のプロキシ サーバーを通過する場合、この値は類似: 220.4.251.159、203.98.182.163) 、203.129.72.215)
この場合、クライアントはプロキシ サーバーを使用していますが、偽のランダム IP (220.4.251.159) を捏造してクライアントの実際の IP を置き換えてスプーフィングしていることも明らかになります。それ。
5. PHP と高匿名性プロキシ サーバーを使用してクライアント IP を取得します: 高匿名性プロキシ (エリート プロキシ)
REMOTE_ADDR = プロキシ サーバー IP
HTTP_X_FORWARDED_FOR = 値なし、または Do
を表示しません REMOTE_ADDR であっても HTTP_FORWARDED_FOR であっても、ブラウザーやネットワーク デバイスが異なれば送信される IP ヘッダー メッセージも異なる可能性があるため、これらのヘッダー メッセージは利用できない場合があります。したがって、$_SERVER["REMOTE_ADDR"] および $_SERVER["HTTP_X_FORWARDED_FOR"] を使用して PHP によって取得される値は、null 値または「不明な」値である可能性があります。
したがって、PHP を使用してクライアント IP を取得するコードは次のようになります。
function getip() { $unknown = 'unknown'; if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)){ $ip = $_SERVER['REMOTE_ADDR']; } /* 处理多层代理的情况 或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown; */ if (false !== strpos($ip, ',')) $ip = reset(explode(',', $ip)); return $ip; } function getip() { $unknown = 'unknown'; if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) { $ip = $_SERVER['REMOTE_ADDR']; } /* 处理多层代理的情况 或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown; */ if (false !== strpos($ip, ',')) $ip = reset(explode(',', $ip)); return $ip; }