ちゃんと覚えておけよ?

忘れちゃいけない事のメモ、覚え書き

プロキシ経由のユーザのIPアドレスをプロキシサーバから取得 PHP

プロキシサーバを経由した場合に REMOTE_ADDR には、プロキシサーバの IP アドレスが 格納されるため、サーバ環境変数(HTTP_CLIENT_IP や TTP_X_FORWARDED_FOR)から クライアント IPアドレスを取得している。

なお、多くのプロキシサーバソフトが HTTP_CLIENT_IP や HTTP_X_FORWARDED_FOR を使用しているために この環境変数から取得しているのであり、すべてのプロキシサーバに対応するわけではない。

また、ヘッダに HTTP_CLIENT_IP などを自前で追加されると、IP アドレスを偽証されてしまうので十分注意・検証すること。

// 指定されたサーバー環境変数を取得する
function getServer($key, $default = null)
{
    return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default;
}

// クライアントのIPアドレスを取得する
function getClientIp($checkProxy = true)
{
    /*
     *  プロキシサーバ経由の場合は、プロキシサーバではなく
     *  接続もとのIPアドレスを取得するために、サーバ変数
     *  HTTP_CLIENT_IP および HTTP_X_FORWARDED_FOR を取得する。
     */
    if ($checkProxy && getServer('HTTP_CLIENT_IP') != null) {
        $ip = getServer('HTTP_CLIENT_IP');
    } else if ($checkProxy && getServer('HTTP_X_FORWARDED_FOR') != null) {
        $ip = getServer('HTTP_X_FORWARDED_FOR');
    } else {
        // プロキシサーバ経由でない場合は、REMOTE_ADDR から取得する
        $ip = getServer('REMOTE_ADDR');
    }
    return $ip;
}

echo getClientIp();

Comment

*