PHP はユーザークライアントの実際の IP をどのように取得しますか?この記事では、PHP でユーザークライアントの実際の IP を取得する方法を紹介します。必要な方は参考にしていただければ幸いです。
クライアント IP の取得は実際には簡単な作業ではありません。IP スプーフィングやプロキシの問題により、クライアント IP の取得の信頼性が損なわれ、100% 正確であることは不可能です。しかし、私たちはクライアントの実際の IP アドレスを取得するためのより完全な方法をまだ見つけようとしています。 php を使用して IP を取得する方法はたくさんあります。
getenv を使用してクライアントの IP アドレスを取得します。例:
function getIp(){ if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return($ip);
PHP では、$_SERVER はサーバーのスーパー グローバル変数配列です。また、$_SERVER['REMOTE_ADDR'] を使用してクライアントの IP アドレスを取得することもできます。 2 つの違いは、getenv が IIS isapi モードで実行される PHP をサポートしていないことです。
ここでは 2 つの関数、getenv() と strcasecmp() が使用されており、値を取得できる場合はその値を返します。 false を返します。
strcasecmp(string1,string2) string 関数の使用法は次のとおりです: string1 と string2 を比較し、等しい場合は 0 を返し、string1 が string2 より大きい場合は 0 より大きい数値を返し、小さい場合は小さい数値を返します。 0よりも。
この関数は最初に顧客の IP を使用します。それが機能しない場合は、REMOTE_ADDR を使用してください。IP を考慮した、より詳細な 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; }
REMOTE_ADDR = クライアント IP
1. プロキシ サーバーを使用せずに PHP でクライアント 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 がアクセス オブジェクトに送信され、本当の身元を隠すという目的を達成できません。
REMOTE_ADDR = 最後のプロキシ サーバー IP
HTTP_X_FORWARDED_FOR = プロキシ サーバー IP (複数のプロキシ サーバーを経由する場合、この値は同様です: 203.98.182.163、203.98.182.163) 、203.129.72.215)
この場合、クライアントの実際の IP は隠されていますが、クライアントはアクセス オブジェクトに公開されています。プロキシ サーバーを使用してアクセスされます。
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) で置き換えて欺瞞します。 名前 V. 匿名性の高いプロキシ サーバーを使用した PHP がクライアント IP の状況を取得する: 高匿名性プロキシ (エリート プロキシ)
Http_x_For = 値なし、または表示なし
Http_Forwarded_For、異なるブラウザーや異なるネットワーク デバイスが異なる IP ヘッダー メッセージを送信する可能性があるため、これらのヘッダー メッセージは取得できない場合があります。したがって、値は$_SERVER["REMOTE_ADDR"] および $_SERVER["HTTP_X_FORWARDED_FOR"] を使用して PHP によって取得される値は、null 値である可能性もあります。また、「不明な」値である可能性もあります。要約: 上記がこの記事の全内容です。みんなの学習に役立つことを願っています。