PHP & ile host maskesi ile IP Filtreleme / Eşleştirme

2 Cevap php

Ben buna benzer bir şey yapmak isteyen kulüpler: http://stackoverflow.com/questions/594112/matching-an-ip-to-a-cidr-mask-in-php5

Ben bir MySQL tablo izin verilmeyen IP / maskeler listesini saklamak ve bir maç için kontrol etmek istiyorum, hariç.

Bağlantı, '10 gibi bir şey .2.0.0/16 de örnek 'tablosundaki bir satır olacak ve sonra geçerli kullanıcı ($ _SERVER IP adresini kontrol etmek istediğiniz [' REMOTE_ADDR ']) ve kontrol gibi eğer karşılaşmalar ya da değil.

Çok teşekkürler :)

2 Cevap

Tablolar üzerine birkaç seçenekleri - okunabilir bir dizeye (4 noktalı bayt) olarak ya da o IP'yi saklayabilirsiniz kullanır cidr_match yerli uzun numara var. Biz (bağlantılı sayfasından cidr_match yeniden) insan okunabilir ile sıkışmış ettik varsayarsak

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;
}

(Siz diğer yazı üzerine cird_match bulabilirsiniz)

Için php.net belgelerine ip2long() yorumların çalışan kodu iyi bir örnek vardır: http://www.php.net/manual/en/function.ip2long.php#86793