【问题标题】:IP Address Validation HelpIP 地址验证帮助
【发布时间】:2010-06-14 17:46:12
【问题描述】:

我正在使用我在浏览时遇到的这个 IP 验证功能,它一直运行良好,直到今天我遇到了问题。

由于某种原因,该函数不会验证此 IP 是否有效:203.81.192.26

我不太擅长正则表达式,所以如果有任何问题,我将不胜感激。

如果您有其他功能,如果您能帮我发布,我将不胜感激。

函数代码如下:

public static function validateIpAddress($ip_addr)
{
    global $errors;

    $preg = '#^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}' .
            '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$#';

    if(preg_match($preg, $ip_addr))
    {
        //now all the intger values are separated
        $parts = explode(".", $ip_addr);

        //now we need to check each part can range from 0-255
        foreach($parts as $ip_parts)
        {
            if(intval($ip_parts) > 255 || intval($ip_parts) < 0)
            {
                $errors[] = "ip address is not valid.";
                return false;
            }

            return true;
        }

        return true;
    } else {
        $errors[] = "please double check the ip address.";
        return false;
    }
}

【问题讨论】:

    标签: php validation ip-address


    【解决方案1】:

    我更喜欢here 描述的简单方法。出于安全目的,这应该被认为是有效的。虽然请确保您从$_SERVER['REMOTE_ADDR'] 获取它,但任何其他 http 标头都可以被欺骗。

    function validateIpAddress($ip){
        return long2ip(ip2long($ip)))==$ip;
    }
    

    【讨论】:

      【解决方案2】:

      已经有一些内置的东西可以做到这一点:http://fr.php.net/manual/en/filter.examples.validation.php 请参见示例 2

      <?php
      
      if (filter_var($ip, FILTER_VALIDATE_IP)) {
          // Valid
      } else {
         // Invalid
      }
      

      【讨论】:

        【解决方案3】:

        您是否尝试过使用内置函数来验证地址?例如,您可以使用ip2longlong2ip 将人类可读的点式IP 地址转换为它所代表的数字,然后再返回。如果字符串相同,则 IP 有效。

        还有filter extension, which has an IP validation option。过滤器默认包含在 PHP 5.2 及更高版本中。

        【讨论】:

          【解决方案4】:

          那么,您为什么要同时进行正则表达式和 int 比较?您正在“双重”检查地址。此外,您的第二次检查无效,因为如果第一个八位字节有效,它将始终返回 true(您在 foreach 循环中有 return true)。

          你可以这样做:

          $parts = explode('.', $ip_addr);
          if (count($parts) == 4) {
              foreach ($parts as $part) { 
                  if ($part > 255 || $part < 0) {
                      //error
                  }
              }
              return true;
          } else {
              return false;
          }
          

          但正如其他人所建议的那样,ip2long/long2ip 可能更适合您的需求......

          【讨论】:

          • 感谢一百万在循环中捕获这些返回 :o 这对我来说有点愚蠢 :( 直到你指出来我才注意到这一点 :o 我更改了函数以匹配你的函数它现在开始验证该地址:) 我a,稍后也将尝试 ip2long/long2ip 方法。再次感谢
          猜你喜欢
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 1970-01-01
          • 2013-07-08
          • 2012-07-02
          • 2013-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多