(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.254
和188.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完全相同。
答案 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
的解决方案是最正确的。