OK、この5つの簡単な手順に従ってみてください...
1. CIDRを配列に格納します(データベースからそれらを読み取ります。これを取得する方法を知っていると思います)
$cidrs = array(
'192.168.1.20/27',
'192.168.0.10/32'
);
2.ユーザーのIP(リモートアドレス)を取得します
$user_ip = $_SERVER['REMOTE_ADDR'];
3.この関数を追加します
function IPvsCIDR($user_ip, $cidr) {
$parts = explode('/', $cidr);
$ipc = explode('.', $parts[0]);
foreach ($ipc as &$v)
$v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);
$ipc = substr(join('', $ipc), 0, $parts[1]);
$ipu = explode('.', $user_ip);
foreach ($ipu as &$v)
$v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);
$ipu = substr(join('', $ipu), 0, $parts[1]);
return $ipu == $ipc;
}
4.ユーザーのIPアドレスを$cidrsと比較します
$validaddr = false;
foreach ($cidrs as $addr)
if (IPvsCIDR($user_ip, $addr)) {
$validaddr = true;
break;
}
5.ユーザーをどうするかを決める
if ($validaddr) {
echo "CORRECT IP ADDRESS";
}
else {
echo "INCORRECT IP ADDRESS";
}
それでおしまい!
この関数がどのように機能するか。CIDRアドレス部分(xxxx)をバイナリ文字列に変換し、最初のN桁を取ります。次に、ユーザーのIPで同じジョブを実行し、値が一致するかどうかを確認します。
例2(関数からの完全なジョブ)
function testUserIP($user_ip, $cidrs) {
$ipu = explode('.', $user_ip);
foreach ($ipu as &$v)
$v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);
$ipu = join('', $ipu);
$res = false;
foreach ($cidrs as $cidr) {
$parts = explode('/', $cidr);
$ipc = explode('.', $parts[0]);
foreach ($ipc as &$v) $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);
$ipc = substr(join('', $ipc), 0, $parts[1]);
$ipux = substr($ipu, 0, $parts[1]);
$res = ($ipc === $ipux);
if ($res) break;
}
return $res;
}
使用法:
$user_ip = $_SERVER['REMOTE_ADDR'];
$cidrs = array('192.168.1.20/27', '192.168.0.10/32');
if (testUserIP($user_ip, $cidrs)) {
// user ip is ok
}
else {
// access denied
}