0

(1.)我希望允许访问者仅从某个 IP 地址范围访问页面(第 2 段)。轻松地将更多 IP 地址的正则表达式添加到 IP 地址列表。

我的正则表达式数组是:

$IP_LIST_ACCESS = array(  
"/^188\.133\.11\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-4]))$/"  
,"/^188\.133\.14\.([1-9]|[1-9][0-9]|1([0-1][0-9]|2[0-8]))$/"  
,"/^127\.0\.0\.1$/"                                                         
);

(2.)上述数组的 IP 范围是188.133.11.1-188.133.11.254and 188.136.14.1-188.136.14.128and127.0.0.1

下面是我检测错误 IP 地址并死掉的代码:

$USER_IP_ADDR = $_SERVER['REMOTE_ADDR'];
foreach ($IP_LIST_ACCESS as $IP_ACC_ARRAY)
{
  if (!preg_match($IP_ACC_ARRAY, $USER_IP_ADDR))
  {
    echo '#INVALID IP'; #DEBUG
    die;
  }
}

(3.)使用我上面的代码,总是给出INVALID IP错误(总是检测为错误的 IP 地址)。
哪里有问题 ?

编辑
(4。)我只是想这样做,如果有更好的方法,与 preg_match 不完全一致。

4

3 回答 3

3

更好地使用正则表达式的 ip2long insted,它更易于阅读并且具有更好的性能。

$ip_ranges = array(
    array(
        'from' => ip2long('188.133.11.1'),
        'to' => ip2long('188.133.11.254')
    ),
    array(
        'from' => ip2long('188.136.14.1'),
        'to' => ip2long('188.136.14.128')
    ),
    array(
        'from' => ip2long('127.0.0.0'),
        'to' => ip2long('127.255.255.255')
    ),
);

$USER_IP_ADDR = $_SERVER['REMOTE_ADDR'];
$USER_IP_ADDR_LONG = ip2long($USER_IP_ADDR);

$USER_IS_PERMITTED = false;
foreach ($ip_ranges as $ip_range) {
    if ($ip_range['from'] <= $USER_IP_ADDR_LONG && $ip_range['to'] >= $USER_IP_ADDR_LONG) {
        $USER_IS_PERMITTED = true;
    }
}


if (!$USER_IS_PERMITTED) {
    echo '#INVALID IP: ' . $USER_IP_ADDR; #DEBUG
    die;
}
于 2012-12-29T10:57:11.063 回答
1

看一下ip2long(),它会从其 Internet 标准格式(点分字符串)表示中生成 IPv4 Internet 网络地址。

稍后,您可以对其执行范围操作。

于 2012-12-29T10:54:53.100 回答
0

我相当肯定你想要if (preg_match($IP_ACC_ARRAY, $USER_IP_ADDR) === 1)。现在,如果匹配,您将显示错误。这是最快的解决方案,但也许ip2long其他答案中提出的基于 - 的解决方案是最正确的。

于 2012-12-29T10:59:39.130 回答