PHP benim web sitesinden belirli bir IP blok blok

4 Cevap php

I'd like, for example, block every IP from base 89.95 (89.95..). I don't have .htaccess files on my server, so I'll have to do it with PHP.

if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die();

Belirli IP engellemek olacaktır. Ben nasıl tüm IP blokları engelleyebilirsiniz?

Çok teşekkür ederim.

4 Cevap

Try strpos()

if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0))
{
    die();
}

Eğer fark ederseniz, === operatörü 89.95 begining IP adresi olduğundan emin kılar. Bu istediğiniz gibi IP adresi olarak çok sepcify olabilir, ve ne olursa olsun ondan sonra gelip ne numaralar engellemek anlamına gelir.

Örneğin, tüm bu bloke olacak:

89.95 -> 89.95.12.34, 89.95.1234.1, 89.95.1.1
89.95.6 -> 89.95.65.34, 89.95.61.1, 89.95.6987

(Bunlardan bazıları olsa geçerli IP adresleri değil)

Bir tamsayı noktalı dörtlü dönüştürmek:

$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));

// only allow 10.0.0.0 – 10.255.255.255
if (!($ip >= 167772160 && $ip <=  184549375)) {
    die('Forbidden.');
}

Bir gerçek IP adresine noktalı ondalık dönüştürmek için ip2long () kullanın. Sonra kolayca aralıkları yapabilirsiniz.

Sadece değerini almak için yüksek ve düşük aralığında () ip2long yok, sonra kod sabitler olarak kullanırız.

Eğer alt maskeleme aşina iseniz, bunu şöyle yapabilirsiniz:

// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$mask = ip2long("255.255.0.0");
$ip = ip2long($_SERVER{'REMOTE_HOST'});
if (($network & $mask) == ($ip & $mask)) {
  die("Unauthorized");
}

Yoksa bu biçimde aşina iseniz 10.12.0.0/16:

// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$prefix = 16;
$ip = ip2long($_SERVER{'REMOTE_HOST'});
if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) {
  die("Unauthorized");
}

Sen fonksiyonları içine bu çevirmek ve çok yönetilebilir kod var, kolay IP adreslerini ekleyin ve aralıkları özelleştirmek için yapım olabilir.

kod adlı canlandırmak kullanarak, joker arama çalışma almak için kullanabilir

// Now let's search if this IP is blackliated
$status = false;
foreach($denied_ips as $val)
{
    if (strpos($val,'*') !== false)
    {
        if(strpos($visitorIp, array_shift(explode("*", $val))) === 0)
        {
            $status = true;
            break;
        }
    }
    else
    {
        if(strcmp($visitorIp, $val) === 0)
        {
            $status = true;
            break;
        }
    }
}