[ PHP ] プロキシサーバ経由の HTTP リクエスト送信元 IP アドレスを取得する

Pocket

WEB サーバにリクエストしたクライアントの IP アドレスを取得するサンプルコードを掲載しています。なお、サンプルコードは Zend Framework のコードを一部修正したものです。

スポンサーリンク


クライアントの 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();

プロキシサーバを経由すると REMOTE_ADDR には、プロキシサーバの IP アドレスが格納されるため、サーバ環境変数(HTTP_CLIENT_IPHTTP_X_FORWARDED_FOR)から クライアント IPアドレスを取得しています。なお、すべてのプロキシサーバに対応するわけではありませんので、事前に確認する必要があります。

プロキシサーバ経由時にヘッダに HTTP_CLIENT_IP を自前で設定された場合には、送信元の IP アドレスが偽証されてしまう可能性もあります。100% 正しい値を取得すると言うことは難しそうですが、特定の環境で使用する社内システムなどであれば問題ないかもしれません。

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>