ホームページ  >  記事  >  バックエンド開発  >  PHPでクライアントの実IPを取得する方法の紹介

PHPでクライアントの実IPを取得する方法の紹介

WBOY
WBOYオリジナル
2016-07-25 09:07:25638ブラウズ
  1. function getIp(){
  2. if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
  3. $ip = getenv("HTTP_CLIENT_IP");
  4. else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
  5. $ip = getenv("HTTP_X_FORWARDED_FOR");
  6. else if (getenv("REMOTE_ADDR") && strcasecmp(getenv) ("REMOTE_ADDR"), "unknown"))
  7. $ip = getenv("REMOTE_ADDR");
  8. else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER[ 'REMOTE_ADDR'], "unknown"))
  9. $ip = $_SERVER['REMOTE_ADDR'];
  10. else
  11. $ip = "unknown";
  12. return($ip);
  13. ?>
コードをコピー

注: 上記のコードでは、getenv() と strcasecmp() という 2 つの関数が使用されています。前者の関数は、値が取得できた場合は値を返し、取得できなかった場合は false を返します。 $_SERVER はサーバーのスーパー グローバル変数配列です。$_SERVER['REMOTE_ADDR'] を使用してクライアントの IP アドレスを取得することもできます。 2 つの違いは、getenv が IIS isapi モードで実行される PHP をサポートしていないことです。 strcasecmp(string1, string2) 文字列関数の使用法は、string1 と string2 が等しい場合は 0 を返し、string1 が string2 より大きい場合は 0 より大きい数値を返します。 0未満が返されます。 この関数は最初にクライアント IP を使用します。それが機能しない場合は、REMOTE_ADDR を使用してください。

ここでは、同様の方法で IP スプーフィングと複数のプロキシ コードを考慮した、IP を検出する別の詳細な方法を示します。

  1. function getip() {
  2. $unknown = 'unknown';
  3. if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER) ['HTTP_X_FORWARDED_FOR'], $unknown) ) {
  4. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  5. } elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER) ['REMOTE_ADDR'], $unknown) ) {
  6. $ip = $_SERVER['REMOTE_ADDR'];
  7. }
  8. /*
  9. マルチレイヤー プロキシ状況を処理する
  10. または通常の方法を使用します: $ip = preg_match("/[d .]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
  11. */
  12. if (false !== strpos($ip, ','))
  13. $ip = reset(explode(',', $ip));
  14. return $ip;
  15. }
  16. ?>
コードをコピーします

参考と学習用に添付ファイル: 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 は隠されていますが、クライアントがプロキシ サーバーを使用してアクセスしていることがアクセス オブジェクトに明らかになります。

4. 欺瞞的なプロキシサーバーの使用: プロキシを歪める REMOTE_ADDR = プロキシ サーバーの IP HTTP_X_FORWARDED_FOR = ランダム IP (複数のプロキシ サーバーを経由する場合、この値は同様になります: 220.4.251.159、203.98.182.163、203.129.72.215) この場合、クライアントはプロキシ サーバーを使用していますが、クライアントの実際の IP ではなく偽のランダム IP (220.4.251.159) を捏造して騙していることも明らかになりました。

5. PHP と高匿名性プロキシ サーバーを使用してクライアント IP を取得する: 高匿名性プロキシ (エリート プロキシ) REMOTE_ADDR = プロキシ サーバーの IP HTTP_X_FORWARDED_FOR = 値がないか、表示されません

REMOTE_ADDR であっても HTTP_FORWARDED_FOR であっても、異なるブラウザーや異なるネットワーク デバイスが異なる IP ヘッダー メッセージを送信する可能性があるため、これらのヘッダー メッセージは利用できない場合があります。そのため、PHP は $_SERVER["REMOTE_ADDR"] および $_SERVER["HTTP_X_FORWARDED_FOR" ] を使用します。取得される値は、null 値または「不明な」値である可能性があります。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。