Справка по проверке IP-адреса - PullRequest
4 голосов
/ 14 июня 2010

Я использую эту функцию проверки 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;
    }
}

Ответы [ 4 ]

8 голосов
/ 14 июня 2010

Я предпочитаю упрощенный подход, описанный здесь .Это должно считаться действительным в целях безопасности.Хотя убедитесь, что вы получаете его из $_SERVER['REMOTE_ADDR'], любой другой заголовок http может быть подделан.

function validateIpAddress($ip){
    return long2ip(ip2long($ip)))==$ip;
}
8 голосов
/ 14 июня 2010

Для этого уже есть что-то встроенное: http://fr.php.net/manual/en/filter.examples.validation.php См. Пример 2

<?php

if (filter_var($ip, FILTER_VALIDATE_IP)) {
    // Valid
} else {
   // Invalid
}
4 голосов
/ 14 июня 2010

Вы пытались использовать встроенные функции для проверки адреса?Например, вы можете использовать ip2long и long2ip для преобразования удобочитаемого точечного IP-адреса в число, которое он представляет, а затем обратно.Если строки идентичны, IP-адрес действителен.

Существует также расширение фильтра , которое имеет параметр проверки IP-адреса .фильтр включен по умолчанию в PHP 5.2 и выше.

1 голос
/ 14 июня 2010

Ну, а почему вы проводите сравнения с регулярными выражениями и с int? Вы "дважды" проверяете адрес. Кроме того, ваша вторая проверка недействительна, так как она всегда будет возвращать true, если первый октет допустим (у вас есть возвращаемое значение true внутри цикла foreach).

Вы можете сделать:

$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 может лучше удовлетворить ваши потребности ...

...