6

我正在使用以下代码段来重定向 IP 地址数组。我想知道如何将整个 IP 地址范围/块添加到我不允许的数组中......

<?php // Let's redirect certain IP addresses to a "Page Not Found"
$disallowed = array("76.105.99.106");
$ip = $_SERVER['REMOTE_ADDR']; 

if(in_array($ip, $disallowed)) {
 header("Location: http://google.com");
 exit;
}
?>

我尝试使用“76.105.99.*”、“76.105.99”、“76.105.99.0-76.105.99.255”,但没有任何运气。

由于其他原因,我需要使用 PHP 而不是 mod_rewrite 和 .htaccess。

4

9 回答 9

11

这是一个如何检查特定网络/掩码组合的示例:

$network=ip2long("76.105.99.0");
$mask=ip2long("255.255.255.0");
$remote=ip2long($_SERVER['REMOTE_ADDR']);

if (($remote & $mask)==$network)
{
    header("Location: http://example.com");
    exit;
}

这比使用基于字符串的匹配要好,因为您可以测试在八位字节内对齐的其他掩码,例如 /20 块 IP

于 2009-09-23T16:02:12.727 回答
3

试试这个substr功能:

$ip = '76.105.99.';
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip)) === $ip) {
    // deny access
}
于 2009-09-23T16:00:55.480 回答
3

你可以用不同的方式来解决这个问题。

如果你想禁止 76.105.99.* 你可以这样做:

if (strpos($_SERVER['REMOTE_ADDR'], "76.105.99.")!==FALSE)
{
    header ('Location: http://google.com');
} 
于 2009-09-23T16:03:56.560 回答
1

你到底有兴趣阻止谁?您可以使用 PHP 或 apache 来阻止(或允许)一堆特定的 IP 地址。

例如,如果您有兴趣阻止来自整个国家/地区的人,那么有一些工具可以为您提供您需要阻止的 IP 地址。不幸的是,它并不像指定一个范围那么简单。

查看http://www.blockacountry.com/它会生成一堆 IP 地址,您可以将其粘贴在 .htaccess 中以阻止整个国家/地区。

于 2009-09-23T16:00:30.610 回答
1

您需要做的是进行测试以查看特定地址是否位于 CIDR 定义的特定地址范围内

例如,你需要能够说

是 192.168.1.5

里面

192.168.1.0/24

假设您有一些基本的工具来完成 CIDR 工作,那么该函数很容易编写。

假设你是32bit系统,这个类http://snipplr.com/view/15557/cidr-class-for-ipv4/ 注意IPisWithinCIDR函数

于 2009-09-23T16:11:17.053 回答
0

最好在 apache(或任何其他服务器)中执行此操作

于 2009-09-23T15:59:58.697 回答
0

我相信您需要创建一个 for 循环来将每个 IP 地址(在范围内)添加到您的数组中。

伪代码

for i = 0 to 255
    disallowed[i] = "76.105.99." + i
next
于 2009-09-23T16:01:26.167 回答
0
$blocked_ip_range_array = array('109.237.108.0','109.238.0.0');
for($i=0;$i<count($blocked_ip_range_array);$i++){
    $network=ip2long($blocked_ip_range_array[$i]);
    $blipr = explode(".",$blocked_ip_range_array[$i]);
    if($blipr[2]=='0'){
        $mask=ip2long("255.255.0.0");
    }
    else{
        $mask=ip2long("255.255.255.0");
    }
    $remote=ip2long($_SERVER['REMOTE_ADDR']);
    if (($remote & $mask)==$network)
    {
        header("Location: http://xurcun.info");
        exit;
    }
}    
于 2011-09-01T18:54:04.143 回答
-2

下面是一个 URL,显示的内容与 Dixon 和 Ameer 先生正在讨论的内容非常相似:http: //www.blackdog.ie/blog/blocking-ip-ranges-with-php/

希望这可以帮助。

尊敬的,威尔

于 2013-08-27T23:21:51.667 回答