在我的网站上用PHP阻止特定的IP块

时间:2010-05-19 22:26:34

标签: php ip

例如,我希望阻止来自89.95(89.95。)的每个IP。 我的服务器上没有.htaccess个文件,因此我必须使用PHP。

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

会阻止特定的IP。如何阻止整个IP块?

非常感谢。

7 个答案:

答案 0 :(得分:12)

尝试strpos()

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

如果您发现,===运营商会确保89.95位于IP地址的开始。这意味着您可以根据需要分配尽可能多的IP地址,并且无论后面有多少数字都会阻止它。

例如,所有这些都将被阻止:

89.95 - > 89.95.12.3489.95.1234.189.95.1.1
89.95.6 - > 89.95.65.3489.95.61.189.95.6987

(其中一些不是有效的IP地址)

答案 1 :(得分:4)

使用ip2long()将点分十进制转换为真实IP地址。然后你可以轻松地做范围。

只需在高低范围内ip2long()获取值,然后将其用作代码中的常量。

如果您熟悉子网掩码,可以这样做:

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

或者如果您熟悉此格式10.12.0.0/16

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

您可以将这些功能转换为功能并具有非常易于管理的代码,从而可以轻松添加IP地址并自定义范围。

答案 2 :(得分:3)

将虚线四边形转换为整数:

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

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

答案 3 :(得分:1)

制作一个子串:) 例如,阻止89.95.25。*你创建一个IP的子字符串,切断最后两个数字并将其与“89.95.25”进行比较。

答案 4 :(得分:1)

$user_ip = $_SERVER['REMOTE_ADDR']; // get user ip

$denyIPs = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($user_ip, $denyIPs)) {
   // blocked ip
}
else {
   // not blocked
}

答案 5 :(得分:0)

使用revive的代码,使用它来进行通配符搜索

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

答案 6 :(得分:-2)

$deny = array("111.111.111", "222.222.222", "333.333.333");

if (in_array($_SERVER['REMOTE_ADDR'], $deny)) {
    header("location:http://www.google.com/");
    exit();
}