Страница 1 из 1

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

Добавлено: 2017-08-30 12:59:41
Vlad5503
Надо сделать проверку валидности 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") }
Выдает "...правильный адрес"
Не подскажете, что я не так сделал.

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

Добавлено: 2017-09-01 13:30:57
zg

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

#!/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 адрес
Значит проблема не в алгоритме проверке адреса. Надо проверять, какие данные приходят на вход.

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

Добавлено: 2017-09-04 3:58:50
Vlad5503
Выкрутился таким методом проверки:

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

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. Если все верно переходим к другой части скрипта, если нет пишем в лог шаг ошибки и выходим.

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

Добавлено: 2017-09-04 14:36:45
f_andrey
И тут прихожу я такой с

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

2001:db8::ab9a:1

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

Добавлено: 2017-09-05 11:11:46
Vlad5503
f_andrey писал(а):И тут прихожу я такой с

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

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

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

Добавлено: 2017-09-07 14:47:13
harmless
Используйте готовые модули - 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

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

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

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

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