繁体   English   中英

基于 IP 范围的限制

[英]Restriction based on IP ranges

我正在构建一个管理面板。 我想阻止某些 IP 范围。 我正在我的本地主机 wamp 服务器上对此进行测试,但 ir 似乎没有重定向我。

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

任何输入表示赞赏。

使用字符串比较就足够了

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

更新:取自 inits answer 的评论

假设我想阻止来自此范围的任何 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 前缀中找到这个字符串。

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

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

// 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";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM