来自数组的PHP IP限制

时间:2012-12-29 10:49:10

标签: php

(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.254188.136.14.1-188.136.14.128以及127.0.0.1

and bellow is 我的代码检测错误的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完全相同。

3 个答案:

答案 0 :(得分:3)

最好使用ip2long而不是正则表达式,它更容易阅读并且具有更好的性能。

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

答案 1 :(得分:1)

查看ip2long(),它会从其Internet标准格式(虚线字符串)表示生成IPv4 Internet网络地址。

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

答案 2 :(得分:0)

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