ホームページ >バックエンド開発 >PHPチュートリアル >PHP がクライアント IP を取得するいくつかの状況の詳細な分析_PHP チュートリアル
この記事で詳しくご紹介します
$_SERVER["REMOTE_ADDR"]はPHPでクライアントIPを取得するためによく使われます。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの 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 を取得します: Anonymous Proxies
REMOTE_ADDR = 最後のプロキシ サーバー IP
HTTP_X_FORWARDED_FOR = プロキシ サーバー IP (複数のプロキシ サーバーを経由する場合、この値は同様です: 203.98. 182.163) 、203.98.182.163、203.129.72.215)
この場合、クライアントの実際の IP は隠されていますが、クライアントがプロキシ サーバーを使用してアクセスしていることがアクセス オブジェクトに明らかになります。性 4. 欺瞞的なプロキシ サーバーを使用する: プロキシを歪める
remote_addr = プロキシ サーバー IPHttp_x_Forwarded_FOR = ランダム IP (複数のプロキシ サーバーを通過する場合、この値は次のようになります: 220.4.251.159、203.98.182.163、203.1 .72。 215)
このケースでは、クライアントがプロキシ サーバーを使用していることも明らかになりましたが、クライアントの実際の IP を置き換えるために偽のランダム IP (220.4.251.159) が偽造されてなりすまされています。
5. PHP と高匿名性プロキシサーバーを使用してクライアント IP を取得する: 高匿名性プロキシ (エリートプロキシ)
REMOTE_ADDR = プロキシサーバー IPHTTP_X_FORWARDED_FOR = 値なしまたは表示なし
REMOTE_ADDR または HTTP_FORWARDED_FOR異なるブラウザーや異なるネットワーク デバイスが異なる IP ヘッダー メッセージを送信する可能性があるため、ヘッダー メッセージは利用できない場合があります。したがって、$_SERVER["REMOTE_ADDR"] および $_SERVER["HTTP_X_FORWARDED_FOR"] を使用して PHP によって取得される値は、null 値または「不明な」値である可能性があります。
<ol class="dp-xml"> <li class="alt"><span><span>function getip() { </span></span></li> <li> <span>$</span><span class="attribute">unknown</span><span> = </span><span class="attribute-value">'unknown'</span><span>; </span> </li> <li class="alt"><span>if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) <br>&& $_SERVER['HTTP_X_FORWARDED_FOR'] <br>&& strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], <br>$unknown) ) { </span></li> <li> <span>$</span><span class="attribute">ip</span><span> = $_SERVER['HTTP_X_FORWARDED_FOR']; </span> </li> <li class="alt"><span>} elseif ( isset($_SERVER['REMOTE_ADDR']) <br>&& $_SERVER['REMOTE_ADDR'] && <br>strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) { </span></li> <li> <span>$</span><span class="attribute">ip</span><span> = $_SERVER['REMOTE_ADDR']; </span> </li> <li class="alt"><span>} </span></li> <li><span>/* </span></li> <li class="alt"><span>处理多层代理的情况 </span></li> <li> <span>或者使用正则方式:$</span><span class="attribute">ip</span><span> = </span><span class="attribute-value">preg_match</span><span>("/[d.]<br>{7,15}/", $ip, $matches) ? $matches[0] : $unknown; </span> </li> <li class="alt"><span>*/ </span></li> <li><span>if (false !== strpos($ip, ',')) </span></li> <li class="alt"> <span>$</span><span class="attribute">ip</span><span> = </span><span class="attribute-value">reset</span><span>(explode(',', $ip)); </span> </li> <li> <span> </span><span>return $ip; </span> </li> <li><span>} </span></li> </ol>
PHP でクライアント IP を取得する際のもう 1 つの注意点は、関数 getenv('HTTP_X_FORWARDED_FOR') または getenv('REMOTE_ADDR') を使用することです。 ') または、上記と同じコードを使用して同じ効果を得ることができます。ただし、getenv() は、IIS isapi モードで実行される PHP をサポートしていません。