IP-фильтрация / сопоставление по маске хоста с PHP и MySQL - PullRequest
0 голосов
/ 30 октября 2009

Я хочу сделать что-то похожее на это: Сопоставление IP с маской CIDR в PHP 5?

Кроме того, я хочу сохранить список запрещенных IP / масок в таблице MySQL и проверить на совпадение.

Как и в примере в ссылке, что-то вроде '10 .2.0.0 / 16 'будет строкой в ​​таблице, а затем я хочу проверить IP-адрес текущего пользователя ($ _SERVER [' REMOTE_ADDR ']) и проверьте, соответствует или нет.

Большое спасибо:)

Ответы [ 2 ]

3 голосов
/ 30 августа 2010

Несколько опций для таблиц - вы можете сохранить 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 в другом сообщении)

0 голосов
/ 30 октября 2009

Документация php.net для ip2long() содержит хороший пример рабочего кода в комментариях: http://www.php.net/manual/en/function.ip2long.php#86793

...