PHP がクライアントの実際の IP アドレスを取得するための 5 つの状況の分析と実装コード、5 つの状況の分析_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:23:20
オリジナル
1016 人が閲覧しました

クライアントの実際のIPアドレスを取得するためのPHPの5つの状況の分析と実装コード、5つの状況の分析

$_SERVER["REMOTE_ADDR"] は、クライアント IP を取得するために PHP でよく使用されます。
(1) ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの IP アドレスであり、実際のクライアントの IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、$_SERVER["HTTP_X_FORWARDED_FOR"] を使用して読み取ります。
(2) ただし、クライアントが「透過プロキシ」を使用する場合に限り、$_SERVER["HTTP_X_FORWARDED_FOR"] の値はクライアントの実際の IP になります (マルチレイヤ プロキシの場合、この値はクライアントの実際の IP と複数の IP である可能性があります)。これは、プロキシ サーバーの IP アドレスをカンマ「,」で区切って構成されます。
(3) 「匿名プロキシ」および「偽プロキシ」の場合は、プロキシ サーバーの IP 値です(マルチレイヤ プロキシの場合、この値は、複数のプロキシ サーバーの IP を で区切って構成する場合があります)。カンマ「,」)。
(4) 「高匿名性プロキシ」の場合はNULL。

HTTPヘッダー情報のREMOTE_ADDRとHTTP_FORWARDED_FORの値について、クライアントの実IPが221.5.252.160であると仮定した場合の分析は以下の通りです。

1. プロキシサーバーを使用せずに、PHP を使用してクライアント IP を取得する方法:

コードをコピーします コードは次のとおりです:
REMOTE_ADDR = 221.5.252.160
HTTP_VIA=値がないか、表示されません
HTTP_X_FORWARDED_FOR = 値がないか、表示されません

2. 透過的プロキシサーバーの使用: 透過的プロキシ

コードをコピーします コードは次のとおりです:
REMOTE_ADDR = 最後のプロキシサーバーのIP
HTTP_VIA=プロキシサーバーの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_VIA=プロキシサーバーのIP
HTTP_X_FORWARDED_FOR = プロキシ サーバー IP (複数のプロキシ サーバーを経由する場合、この値は同様になります: 203.98.182.163、203.98.182.163、203.129.72.215)
この場合、クライアントの実際の IP は隠されていますが、クライアントがプロキシ サーバーを使用してアクセスしていることがアクセス オブジェクトに明らかになります。

4. 欺瞞的なプロキシサーバーの使用: プロキシを歪める

コードをコピーします コードは次のとおりです:
REMOTE_ADDR = プロキシサーバーIP
HTTP_VIA=プロキシサーバーの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_VIA=値がないか、表示されません

HTTP_X_FORWARDED_FOR = 値がないか、表示されません。

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

PHP でクライアント IP を取得するときに注意すべきもう 1 つの点は、関数 getenv('HTTP_X_FORWARDED_FOR') または getenv('REMOTE_ADDR') を使用して上記のコードと同じ効果を達成できることです。ただし、getenv() は、IIS isapi モードで実行される PHP をサポートしていません。

REMOTE_ADDR は、クライアントがサーバーと「ハンドシェイク」するときの IP です。 「匿名プロキシ」が使用されている場合、REMOTE_ADDR にはプロキシ サーバーの IP が表示されます。

HTTP_CLIENT_IP は、プロキシ サーバーによって送信される HTTP ヘッダーです。 「スーパー匿名プロキシ」の場合は、値 none が返されます。同様に、REMOTE_ADDR はこのプロキシ サーバーの IP に置き換えられます。

$_SERVER['REMOTE_ADDR'] //アクセス (おそらくユーザー、おそらくプロキシ) IP

$_SERVER['HTTP_CLIENT_IP'] //エージェント側 (存在する可能性がありますが、偽造される可能性があります)

$_SERVER['HTTP_X_FORWARDED_FOR'] //ユーザーがプロキシとして使用している IP (存在する可能性もあれば、偽造される可能性もあります)

上記の状況に基づいて書かれた PHP コード:


コードをコピーします コードは次のとおりです:

関数 getip() {
$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']
}
}
?>


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

IPアクセスが制限されているWebページにこの機能を適用すると、IPアクセスが制限されているセグメントのプロキシサーバーを経由しても他の人はそのページにアクセスできなくなります。
関数は以下に提供されます: // 関数 getIP() を定義します
function getIP(){global $ip;
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP") ;
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");else$ip = " Unknow ";
return $ip;}
// 使用法:
echo getIP();?>
getenv("REMOTE_ADDR") はクライアントの IP アドレスを取得するために使用されますが、クライアントがプロキシ サーバーを使用してアクセスする場合、この場合、取得されるのはプロキシ サーバーの IP アドレスであり、実際のクライアントの IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、getenv("HTTP_X_FORWARDED_FOR") を使用して読み取ります。
ただし、クライアントがプロキシサーバー経由でアクセスしない場合、getenv("HTTP_X_FORWARDED_FOR") で取得した値は空になります。
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
は、getenv("HTTP_X_FORWARDED_FOR") によって取得された値が空でない場合 (つまり、クライアントがプロキシ サーバーを使用している場合) を意味します。の場合、変数 $ip は getenv("HTTP_X_FORWARDED_FOR") によって取得される実際の IP 値と等しくなります。
上記の else if(getenv("HTTP_X_FORWARDED_FOR")) で取得した値が空の場合 (つまり、プロキシ サーバーが使用されていない場合)、次の $ip = getenv("HTTP_X_FORWARDED_FOR") 行のステートメントは実行されません。
この場合、クライアントがプロキシ サーバーを使用していないことが確認されているため、
else if(getenv("REMOTE_ADDR"))
が渡されます。

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

.X.XXX.XXX シリーズの IP、この関数は LAN ゲートウェイ出口の IP アドレスを取得します。訪問者がプロキシ サーバーを使用している場合、プロキシ サーバーの IP は取得されませんが、訪問者のゲートウェイの実際の IP が取得されます。 。 IP アクセスが制限されている Web ページにこの機能を適用すると、IP アクセスが制限されたセグメント内のプロキシ サーバーを経由しても、他のユーザーはそのページにアクセスできなくなります。関数は以下に提供されます: getenv("REMOTE_ADDR") は、クライアントの IP アドレスを取得するために使用されます。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの IP アドレスです。実際のクライアント IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、getenv("HTTP_X_FORWARDED_FOR") を使用して読み取ります。ただし、クライアントがプロキシサーバーを介してアクセスしない場合、getenv("HTTP_X_FORWARDED_FOR") で取得される値は空になります。 else if(getenv("HTTP_X_FORWARDED_FOR"))$ip = getenv("HTTP_X_FORWARDED_FOR"); は、getenv("HTTP_X_FORWARDED_FOR") によって取得された値が空でない場合 (つまり、クライアントがプロキシ サーバーを使用している場合)、変数 $ip は、getenv("HTTP_X_FORWARDED_FOR") によって取得される実際の IP 値と等しくなります。上記の else if(getenv("HTTP_X_FORWARDED_FOR")) によって取得された値が空の場合 (つまり、プロキシ サーバーが使用されていない場合)、次の $ip = getenv("HTTP_X_FORWARDED_FOR") 行のステートメントは実行されません。この場合、クライアントがプロキシ サーバーを使用していないことが確認されているため、else if(getenv("REMOTE_ADDR")) の 2 行ステートメントによって取得されるクライアントの IP アドレスも実際の IP アドレスです。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/840753.html技術記事 PHP がクライアントの実際の IP アドレスを取得する 5 つの状況の分析と実装コード 5 つの状況の分析: $_SERVER["REMOTE_ADDR"] は、クライアント IP を取得するために PHP でよく使用されます。 (1) ただし、クライアントがプロキシを使用している場合...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート