ホームページ >バックエンド開発 >PHPチュートリアル >PHP がクライアント IP を取得するいくつかの状況の詳細な分析_PHP チュートリアル

PHP がクライアント IP を取得するいくつかの状況の詳細な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-15 13:32:17752ブラウズ

この記事で詳しくご紹介します

$_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 値または「不明な」値である可能性があります。

したがって、PHP を使用してクライアント IP を取得するコードは次のようになります:

<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 をサポートしていません。



http://www.bkjia.com/PHPjc/446150.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446150.html技術記事この記事では、PHP でクライアント IP を取得するためによく使用される $_SERVER[REMOTE_ADDR] について詳しく紹介します。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得される...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。