Несколько опций для таблиц - вы можете сохранить IP-адрес в виде удобочитаемой строки (4 точечных байта) или в его собственном длинном номере, который использует cidr_match. Предполагая, что мы застряли с удобочитаемым человеком (для повторного использования cidr_match
со связанной страницы)
function testIP($ip=$_SERVER['REMOTE_ADDR']) {
//Returns TRUE - valid, FALSE - denied
/* Get the data from the database and return it in rows
* this could be real-time retrieved, or pulled into an array
* first
* assumes: deny_ranges(ip VARCHAR(45) not null,mask INT not null default 0)
* eg: $denyips= get "SELECT ip,mask FROM deny_ranges" from database
*/
foreach($denyips as $row) {
if ($row["mask"]==0) {
//No need to use overhead of CIDR_MATCH
//Exact match - reject
if ($row["ip"]==$ip) return false;
} elseif (cidr_match($ip,$row["ip"]."/".$row["mask"])==true) {
//In denied range - reject
return false;
}
}
//Got through all rejected ranges+ips - it's good
return true;
}
(Вы можете найти cird_match
в другом сообщении)