/** * 任意のIPアドレス帯域内からのアクセスか? * * 引数の数により処理内容が変わる * 1. $_SERVER['REMOTE_ADDR']が第一引数の帯域にあるかチェックする * 2. 第一引数が第二引数の帯域にあるかチェックする * 3. (2)に加えて第三引数とリモートホストを正規表現マッチングする * * (2007/08/05 aki 引数の数で処理内容を変えるのではなく、 * 単に、$addr と $band の順番を入れ替えた方がわかりやすいような気がしたがどうでしょうどうでしょう(>rskさん)) * * 帯域指定は以下のいずれかの方式を利用できる (2,3の混在も可) * 1. IPアドレス(+スラッシュで区切ってマスク長もしくはサブネットマスク)の文字列 * 2. (1)の配列 * 3. IPアドレスをキーとし、マスク長もしくはサブネットマスクを値にとる連想配列 * * @return boolean * @access private * @static */ function isAddrInBand($addr, $band = null, $regexHost = null) { if (is_null($band)) { $regexHost = null; $band = $addr; $addr = $_SERVER['REMOTE_ADDR']; } // IPアドレスを検証 if (($addrlong = HostCheck::ip2long($addr)) === false) { return false; } // IPアドレスを検証 if (!is_array($band)) { $band = array($band); } foreach ($band as $target => $mask) { if (is_int($target) && is_string($mask)) { $cond = explode('/', $mask); $target = $cond[0]; $mask = isset($cond[1]) ? is_numeric($cond[1]) ? intval($cond[1]) : $cond[1] : '255.255.255.255'; } if (($target = HostCheck::ip2long($target)) === false) { continue; } if (is_int($mask)) { $mask = HostCheck::length2subnet($mask); } if (($mask = HostCheck::ip2long($mask)) === false) { continue; } if (($addrlong & $mask) == ($target & $mask)) { return true; } } /* // ホストでの判別はやめておく // 帯域がマッチせず、正規表現が指定されているとき if ($regexHost) { if ($addr == $_SERVER['REMOTE_ADDR'] && isset($_SERVER['REMOTE_HOST'])) { $remote_host = $_SERVER['REMOTE_HOST']; } else { $remote_host = HostCheck::cachedGetHostByAddr($addr); } if (preg_match($regexHost, $remote_host)) { return true; } } */ return false; }