在第一个IP上测试阵列中的IP总是失败

时间:2011-10-11 作者:Pippin

我正在开发一个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。

据我所知,数组的第一个索引和任何过去的索引之间绝对没有区别。

你知道为什么第一个索引位置即使是有效的数组也无法验证吗?

谢谢

1 个回复
最合适的回答,由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阵列中。

结束

相关推荐

Manipulate Permalink

我正在使用WPML翻译一个网站。我对WPML的唯一主要问题是,不能用同一slug创建不同语言的页面。因此www.example。com/contact/和www.example。无法进行com/fr/contact/。为了解决这个问题,我想把法语版本保存为www.example。com/fr/contact-fr/在数据库中,但对用户透明。为了做到这一点,我正在考虑操纵URL,以便用户看到www.example。com/fr/contact/但Wordpress将其处理为www.example。通信/传真