Проверка ipна валидность.

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Проверка ipна валидность.

Непрочитанное сообщение Vlad5503 » 2017-08-30 12:59:41

Надо сделать проверку валидности ip, который приходит в переменной к скрипту на перле. В инете нашел вариант Дмитрия Рассанова:

Код: Выделить всё

if ( $ip =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
   && ($1 < 256 && $2 < 256  && $3 < 256  && $4 < 256 ) ) {
   # $ip – правильный IP адрес
} else { # $ip – неверный IP адрес}
Но этот вариант не работает у меня. Т.е. он пропускает такие адреса как 192.168.2.300 и подобные ошибки в любом октете.
Перл работает на базе Freebsd 10.3 и

Код: Выделить всё

# perl -v
This is perl 5, version 24, subversion 1 (v5.24.1)
Ну и сам скрипт:

Код: Выделить всё

#!/usr/local/bin/perl

#cgi-bin/on.pl?id=172.16.***.***
print ("Content-type: text/html\n\n");
use strict;
use CGI ':standard';
use Encode;

my $id = param ('id');
my $IP = $ENV{'REMOTE_ADDR'};

if ( $id =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
   && ($1 < 256 && $2 < 256  && $3 < 256  && $4 < 256 ) ) {
   print("$id – правильный IP адрес"."\n");
} else { print("$id – неверный IP адрес"."\n") }
Выдает "...правильный адрес"
Не подскажете, что я не так сделал.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Проверка ipна валидность.

Непрочитанное сообщение zg » 2017-09-01 13:30:57

Код: Выделить всё

#!/usr/bin/perl -w

my $id = '172.16.***.***';

if ( $id =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
   && ($1 < 256 && $2 < 256  && $3 < 256  && $4 < 256 ) ) {
   print("$id – правильный IP адрес"."\n");
} else { print("$id – неверный IP адрес"."\n") }
Выдаёт

Код: Выделить всё

172.16.***.*** – неверный IP адрес
Значит проблема не в алгоритме проверке адреса. Надо проверять, какие данные приходят на вход.

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Проверка ipна валидность.

Непрочитанное сообщение Vlad5503 » 2017-09-04 3:58:50

Выкрутился таким методом проверки:

Код: Выделить всё

my $v1;
my $v2;
my $v3;
my $v4;
    ($v1, $v2, $v3, $v4) = split(/\./, $id);
        if ($v1 eq 172) {
                        }
        else {
    if (open(LOG, ">>$loge"))   {
    print LOG "v1-$id"."\n";
    close(LOG);
    }
            exit 0;
            }
        if ($v2 eq 16) {
                        }
        else {
    if (open(LOG, ">>$loge"))   {
    print LOG "v2-$id"."\n";
    close(LOG);
    }
            exit 0;
            }
        if (($v3 >= 0) && ($v3 < 256)) {
                        }
        else {
    if (open(LOG, ">>$loge"))   {
    print LOG "v3-$id"."\n";
    close(LOG);
    }
            exit 0;
            }
        if (($v4 >= 0) && ($v4 < 256)) {
                        }
        else {
    if (open(LOG, ">>$loge"))   {
    print LOG "v4-$id"."\n";
    close(LOG);
    }
            exit 0;
            }

if ($kod eq "1")        {
    if (open(LOG, ">$log"))     {
    print LOG "$IP"."\n";
    close(LOG);
    }
                        print("OK"."\n");
    }   else    {
        if ($kod eq "0")        {
                if (open(LOG, ">$log")) {
                print LOG "$IP"."\n";
                close(LOG);
                                        }
                        print("OK"."\n");
                                        }
                        }
exit 0;
В этой части скрипта проверяю по маске два октета на совпадение к 172.16 и два на диапазон от 0 до 255. Если все верно переходим к другой части скрипта, если нет пишем в лог шаг ошибки и выходим.

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

Проверка ipна валидность.

Непрочитанное сообщение f_andrey » 2017-09-04 14:36:45

И тут прихожу я такой с

Код: Выделить всё

2001:db8::ab9a:1
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Проверка ipна валидность.

Непрочитанное сообщение Vlad5503 » 2017-09-05 11:11:46

f_andrey писал(а):И тут прихожу я такой с

Код: Выделить всё

2001:db8::ab9a:1
Сами понимаете, что не пропустит скрипт Ваш адрес(171.154.0.1). Да и 172.16.*.* в версии 6 будет выглядеть в формате fe80:0:0:0:0:0:ac10:*
И задачи проверять версию 6 нету на текущий момент. Появиться потребность - будем дорабатывать скрипт.

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Проверка ipна валидность.

Непрочитанное сообщение harmless » 2017-09-07 14:47:13

Используйте готовые модули - http://search.cpan.org/~drolsky/Data-Va ... date/IP.pm

Отправлено спустя 5 минут 59 секунд:
И еще какая-то у вас загадочная система

Код: Выделить всё

# perl -v

This is perl 5, version 24, subversion 2 (v5.24.2) built for amd64-freebsd-thread-multi

Copyright 1987-2017, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

Код: Выделить всё

# cat test                                                                                                                                                                                                     
#!/usr/local/bin/perl -w

use strict;
#use CGI ':standard';
use Encode;

print "Enter IP Address:";
my $ip = <STDIN>;
if ( $ip =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ && ($1 < 256 && $2 < 256  && $3 < 256  && $4 < 256 ))
{
 print "yes match $1 $2 $3 $4\n";
}
else
{
 print "no match\n";
}

Код: Выделить всё

# ./test
Enter IP Address:10.0.0.1
yes match 10 0 0 1
# ./test
Enter IP Address:10.0.0.256
no match
# ./test
Enter IP Address:10.0.***.***
no match

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Проверка ipна валидность.

Непрочитанное сообщение Vlad5503 » 2017-09-08 3:35:02

harmless писал(а): Отправлено спустя 5 минут 59 секунд:
И еще какая-то у вас загадочная система
А в чём загадочная?
Ставил freebsd 10.3 на рейд-1. На неё ставил ПО через Pkg.

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Проверка ipна валидность.

Непрочитанное сообщение harmless » 2017-09-11 12:23:53

Vlad5503 писал(а):
harmless писал(а): Отправлено спустя 5 минут 59 секунд:
И еще какая-то у вас загадочная система
А в чём загадочная?
Ставил freebsd 10.3 на рейд-1. На неё ставил ПО через Pkg.
Я предоставил код и его реакции на входные данные - все отрабатывает как должно
Почему у вас иное поведение - загадка