我正在开发一个IP限制插件,但有一个奇怪的问题。
我在设置页面中有一个文本区域,其中输入了应该允许的每个IP地址,每行一个。然后我将IP解析为如下数组:
$ips = trim($cmm_options[\'ips\']);
$ips = array_filter(explode("\\n", $ips), \'trim\');
这将生成如下所示的数组:
Array
(
[0] => 67.6.134.102
[1] => 97.118.69.236
)
加载页面时,将根据此数组检查访问者IP地址,如下所示:
function cmm_ip_test($ips){
//testing that correct IP address used
for($i = 0, $cnt = count($ips); $i<$cnt; $i++) {
$ipregex = preg_replace(\'/\\./\', \'\\.\', $ips[$i]);
$ipregex = preg_replace(\'/\\*/\', \'.*\', $ipregex);
if(preg_match(\'/\'.$ipregex.\'/\', $_SERVER[\'REMOTE_ADDR\'])){
// apply filter
return true;
}
//do not apply filter
}
return false;
}
除了阵列中的第一个IP之外,所有这些都工作得非常好。例如,假设我的IP是67.6.134.102,它是在textarea中输入的第一个(因此也是数组中的第一个),像这样cmm\\u IP\\u test()函数将返回false。如果随后将IP移动到textarea的第二行(或除第一行以外的任何其他行)并加载页面,cmm\\u IP\\u test()将返回true。
据我所知,数组的第一个索引和任何过去的索引之间绝对没有区别。
你知道为什么第一个索引位置即使是有效的数组也无法验证吗?
谢谢
最合适的回答,由SO网友:John Kary 整理而成
此代码有两部分:1)从文本区域(由换行符分隔)解释允许的IP列表,2)检查给定用户的IP是否在允许的IP列表中。
第1部分)分析由换行符分隔的IP列表,并修剪空白:
$_POST[\'allowed_ips\'] = " 67.6.134.102
97.118.69.236 ";
$ips = array_map(\'trim\', explode("\\n", $_POST[\'allowed_ips\']));
var_dump($ips); //This should match your Array() output from above
第2部分)根据用户当前IP检查允许的IP列表:
var_dump(in_array($_SERVER[\'REMOTE_ADDR\'], $ips));
in_array()
允许您获取字符串并检查它是否作为值存在于数组中。由于您有一个要允许的所有IP的列表,因此只需检查用户的当前IP(
$_SERVER[\'REMOTE_ADDR\']
) 位于允许的IP阵列中。