【问题标题】:Restriction based on IP ranges基于 IP 范围的限制
【发布时间】:2011-09-05 08:28:30
【问题描述】:

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

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

感谢任何输入。

【问题讨论】:

  • 你也想检查子网吗? 127.0.0.0127.0.0.15?
  • 如果你更详细地比较这两个问题,它不是重复的。

标签: php ip range


【解决方案1】:

使用字符串比较就足够了

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

更新:取自 inits 答案的 cmets

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

【讨论】:

    【解决方案2】:
    $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);
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 真正的正则表达式应该是:^127\.0\.0\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$。 (顺便提一下:反对票不是我;))
      • 这里不需要慢的正则表达式。简单的 substr、strcmp 或 strncmp 就足够了。编辑:我也没有投反对票
      • 假设我想阻止来自此范围的任何 IP:192.168.0.1-255。什么是最好的解决方案?谢谢。
      • 正则表达式是一种无法消化的自然怪胎,应该受到各种黑魔法和投票的惩罚:D(顺便说一句没问题,感谢正确的正则表达式@KingCrunch)。
      【解决方案4】:

      这是我对仅允许某些固定 IP 和某些 IP 范围的问题的解决方案:

      $ClientIP = $_SERVER['REMOTE_ADDR'];
      $First3PartsOfIP = substr($ClientIP, 0, strrpos($ClientIP, '.'));
      $AllowedIPs = ['127.0.0.1'];
      $AllowedFirst3Parts = ['172.20.8', '172.21.13'];
      if (!in_array($ClientIP, $AllowedIPs) && !in_array($First3PartsOfIP, $AllowedFirst3Parts)) {
          //echo "Your IP: $ClientIP<br />";
          die("Access Denied!");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-06
        • 2010-12-09
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多