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

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

伊谢尔伦
伊谢尔伦オリジナル
2016-11-26 14:14:231022ブラウズ

$_SERVER["REMOTE_ADDR"] は、クライアント IP を取得するために PHP でよく使用されます。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの 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 = プロキシ サーバー 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 ヘッダー メッセージも異なる可能性があるため、メッセージは利用できない場合があります。したがって、$_SERVER["REMOTE_ADDR"] および $_SERVER["HTTP_X_FORWARDED_FOR"] を使用して PHP によって取得される値は、null 値または「不明な」値である可能性があります。

したがって、PHP を使用してクライアント 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;  
}


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