ホームページ  >  記事  >  バックエンド開発  >  PHP を使用してクライアントとサーバーの IP を取得する

PHP を使用してクライアントとサーバーの IP を取得する

王林
王林転載
2019-08-19 16:01:145680ブラウズ

1. PHP がクライアント IP を取得する

PHP がクライアント IP を取得する場合、$_SERVER["REMOTE_ADDR"] がよく使用されます。ただし、クライアントがプロキシ サーバーを使用してアクセスする場合、取得されるのはプロキシ サーバーの IP アドレスであり、実際のクライアントの IP アドレスではありません。プロキシ サーバー経由でクライアントの実際の IP アドレスを取得するには、$_SERVER["HTTP_X_FORWARDED_FOR"] を使用して読み取ります。

ただし、クライアントが「透過プロキシ」を使用する場合に限り、$_SERVER["HTTP_X_FORWARDED_FOR"] の値はクライアントの実際の IP になります (マルチレイヤ プロキシの場合、この値はクライアントの実際の IP)IP と複数のプロキシ サーバーの IP をカンマ「,」で区切って);「匿名プロキシ」および「偽プロキシ」の場合は、プロキシ サーバーの IP 値です(マルチレイヤ プロキシの場合、この値はカンマ「,」で区切られた複数のプロキシ サーバー IP で構成される場合があります。「高匿名性プロキシ」の場合は空の値です。

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 ですか (存在する可能性もあれば、偽造される可能性もあります)。HTTP プロキシの後のクライアント IP アドレスを識別するために使用される標準定義があります。形式は clientip、proxy1、proxy2 です。詳細な説明については、http://zh.wikipedia.org/wiki/X-Forwarded-For を参照してください。

3 つの値の違いは次のとおりです:

1. プロキシ サーバーが使用されていない場合:

REMOTE_ADDR = あなたの IP
HTTP_VIA = なし 値または表示なし
HTTP_X_FORWARDED_FOR = 値なしまたは表示なし

# 2. 透過的プロキシ サーバーを使用する場合: 透過的プロキシ

REMOTE_ADDR =最後のプロキシ サーバー IP
HTTP_VIA = プロキシ サーバー IP
HTTP_X_FORWARDED_FOR = 実際の IP 複数のプロキシ サーバーを経由する場合、この値は次のようになります: 203.98.182.163、203.98.182.163、203.129.72.215。

このタイプのプロキシ サーバーは依然としてあなたの情報を訪問者に転送するため、あなたの本当の身元を隠すという目的を達成することはできません。

3. 通常の匿名プロキシ サーバーを使用する場合: 匿名プロキシ

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、複数のプロキシ サーバーを経由する場合、この値は 203.98.182.163、203.98.182.163、203.129.72.215 のようになります。

訪問者に、プロキシ サーバーを使用していることを伝えますが、実際の IP の代わりに偽のランダム IP を作成して騙します。

5. 高匿名性プロキシ サーバーを使用する場合: 高匿名性プロキシ (エリート プロキシ)

REMOTE_ADDR = プロキシ サーバー IP
HTTP_VIA = 値がないかどうか表示される
HTTP_X_FORWARDED_FOR = 値がないか、表示されません。複数のプロキシ サーバーを経由する場合、この値は次のようになります: 203.98.182.163、203.98.182.163、203.129.72.215。

プロキシ サーバーを使用してオブジェクトに直接アクセスしているのと同じように、すべての情報をプロキシ サーバーの情報で完全に置き換えます。

サンプルコード:

//获取用户IP, 定义一个函数getIP()
function getClientIP(){
if (getenv("HTTP_CLIENT_IP")) {
	$ip = getenv("HTTP_CLIENT_IP");
}elseif(getenv("HTTP_X_FORWARDED_FOR")) {
	$ip = getenv("HTTP_X_FORWARDED_FOR");
}elseif(getenv("REMOTE_ADDR")) {
$ip = getenv("REMOTE_ADDR");
	else $ip = "Unknow";
}
return $ip;
}
或者
function getClientIp() {
	$ip = 'unknow';
    foreach (array(
                'HTTP_CLIENT_IP',
                'HTTP_X_FORWARDED_FOR',
                'HTTP_X_FORWARDED',
                'HTTP_X_CLUSTER_CLIENT_IP',
                'HTTP_FORWARDED_FOR',
                'HTTP_FORWARDED',
                'REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                //会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤
                //也可以修改成正则验证IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
    }
    return $ip;
}

2.php サーバー側 IP

サーバー側 IP 関連の変数を取得します
a. $_SERVER [" SERVER_NAME"] を取得するには、関数 gethostbyname() を使用する必要があります。この変数はサーバー側とクライアント側の両方で正しく表示されます。

b. $_SERVER["SERVER_ADDR"]、サーバー側でテスト: 127.0.0.1 (これは httpd.conf の BindAddress の設定値に関連します)。クライアントでのテスト結果は正しいです。

/**
* 获取服务器端IP地址
 * @return string
 */
function getServerIp() { 
    if (isset($_SERVER)) { 
        if($_SERVER['SERVER_ADDR']) {
            $server_ip = $_SERVER['SERVER_ADDR']; 
        } else { 
            $server_ip = $_SERVER['LOCAL_ADDR']; 
        } 
    } else { 
        $server_ip = getenv('SERVER_ADDR');
    } 
    return $server_ip; 
}
或者
function getServerIP(){    
    return gethostbyname($_SERVER["SERVER_NAME"]);    
}

その他の関連する質問については、PHP 中国語 Web サイトの関連質問チュートリアルをご覧ください: https://www.php.cn/

以上がPHP を使用してクライアントとサーバーの IP を取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。