基于IP范围的限制

时间:2011-05-31 09:37:54

标签: php ip range

我正在建立一个管理面板。我想阻止某些IP范围。我正在我的localhost wamp服务器上测试这个,但是似乎没有重定向我。

<?php
   if($_SERVER['REMOTE_ADDR'] == '127.0.0..*') 
      header("Location: http://google.com");
   else
      echo "Hai";
?>

赞赏任何意见。

3 个答案:

答案 0 :(得分:4)

足以使用字符串比较

if (strncmp('127.0.0.', $_SERVER['REMOTE_ADDR'], 8) === 0)
  header("Location: http://google.com");
else
  echo "Hai";

更新:取自inits的评论

  

假设我想阻止来自此范围的任何IP:192.168.0.1-255。什么是最好的解决方案?感谢。

然后只对该块进行相同的字符串比较

if (strncmp('192.168.0.', $_SERVER['REMOTE_ADDR'], 10) === 0)
  header("Location: http://google.com");
else
  echo "Hai";

如果要同时针对两个块测试远程地址,您可能会将它们放在一个表达式中。这次我们需要一种不同的方法

if (in_array(substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], '.')), array('127.0.0', '192.168.0'))) {
  header("Location: http://google.com");
else
  echo "Hai";

substr() - 部分获取IP直到最后.。我们可以尝试在IP前缀的集合( - &gt;数组)中找到此字符串。

答案 1 :(得分:3)

$ip0 = ip2long("127.0.0.1");
$ip1 = ip2long("127.0.0.254");
$ip  = ip2long($_SERVER['REMOTE_ADDR']);

if ($ip0 <= $ip && $ip <= $ip1) {
    echo long2ip($ip) . " is inside  range " . long2ip($ip0) . "-" . long2ip($ip1);
}
else {
    echo long2ip($ip) . " is outside range " . long2ip($ip0) . "-" . long2ip($ip1);
}

答案 2 :(得分:0)

这是一种更好的方法,使用正则表达式:

// returns true for IPs 127.0.0.0-255
if (preg_match("'^127[.]0[.]0[.][0-9]+'",$_SERVER['REMOTE_ADDR']))
{
    header("Location: http://google.com");
}
else
{
    echo "Hai";
}

编辑:很好,把它带到另一个级别,可能不是最有效,但更容易配置:

$mask = "192.168.1.1-255";

$ip = explode(".",$_SERVER['REMOTE_ADDR']);
$in = 0;
foreach (explode(".",$mask) as $k => $v)
{
    if (preg_match("'^([0-9]+)-([0-9]+)$'",$v,$n))
    {
        if ($ip[$k] >= $n[1] && $ip[$k] <= $n[2]) $in++;
    }
    elseif (preg_match("'^[0-9]+$'",$v,$n))
    {
        if ($ip[$k] == $n[0]) $in++;
    }
}
if ($in == 4)
{
    header("Location: http://google.com");
}
else
{
    echo "Hai";
}