SYSTEM238 / NOTES1 / PHP / PHPでIPアドレスを判定してアクセスを制限する

NOTES1 PROG1
PHPでIPアドレスを判定してアクセスを制限する
PHPでIPアドレスを判断してアクセス制御するスクリプト。.htaccessのアクセス制限と比べると柔軟に対応できるので便利。

概要

PHPでIPアドレスを判定してアクセスを制限するためのスクリプト。.htaccessのアクセス制限のPHP版。

.htaccessでのアクセス制限だとページ単位でアクセス許可/拒否しかできないが、PHPスクリプトで実装すれば細かい制御が出来る。 (例:海外からのアクセスだとコメント投稿欄を非表示にする)

許可IP範囲は自分の好きに設定できるので日本国外拒否、携帯のみ、企業単位で設定とかもオッケーです。

許可IP範囲の指定は...

  • 別ファイルで指定するようにして複数IP範囲が指定可能
  • アドレス範囲の指定方法はサブネットマスクを使用できる(.htaccessの記述方法の簡易版)

で可能です。

PHPスクリプト

/*
 * IPアドレスのチェック
 * @param   String  $remoteIp           リモートIP
 * @param   String  $allowIpListFile    許可IPリストのファイル
 * @return  boolean
 */
function checkIp($remoteIp, $allowIpListFile){
    foreach (@file($allowIpListFile) as $ipAndMask){
        $ipAndMask = chop($ipAndMask);
        if (''  === $ipAndMask)                 continue;
        if ('#' === substr($ipAndMask, 0, 1))   continue;

        list($allowIp, $mask) = explode("/", $ipAndMask);

        $remoteLong = ip2long($remoteIp) >> (32 - $mask);
        $allowLong  = ip2long($allowIp)  >> (32 - $mask);

        if ($remoteLong == $allowLong)  return true;
    }
    return false;
}

許可IPリスト例(allow_ip_list.txt)

# 2011.07.26 
# http://ftp.apnic.net/stats/apnic/delegated-apnic-latest

1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
1.5.0.0/16
1.21.0.0/16
  :
  :
223.223.208.0/21
223.223.224.0/19

使用例

// 許可IP範囲ファイル(allow_ip_list.txt)は同一ディレクトリにあると想定。
if (checkIp($_SERVER["REMOTE_ADDR"], 'allow_ip_list.txt')){
    echo "許可";
}else{
    echo "不許可";
}

その他

国内のみアクセス許可のリストを国内のみ許可のIPリストを作成するツールから取得できます。

許可IPリストが大きかったりアクセスが集中したりする場合は、APC等のコードキャッシュを使用してPHPコード中にリストを直接埋め込んだ方がいいかもしれない。(未確認、要ベンチ)