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

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.

Ответить


Этот вопрос предназначен для предотвращения автоматической отправки форм спам-ботами.
Смайлики
:smile: :( ;-) :roll: :pardon: 8) :x :oops: :shock: :cz2: :-D :ROFL: :Yahoo!: :cry: :Search: :Bravo: :good: :bad: :sorry: :no: :unknown: :evil: :crazy: :"": :fool: :-o :drinks: :st: :bn:
Ещё смайлики…

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[flash] ОТКЛЮЧЕН
[url] ВКЛЮЧЁН
Смайлики ВКЛЮЧЕНЫ

Обзор темы
   

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Развернуть Обзор темы: Проверка ipна валидность.

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

Сообщение harmless » 2017-09-11 12:23:53

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

А в чём загадочная?
Ставил freebsd 10.3 на рейд-1. На неё ставил ПО через Pkg.

Я предоставил код и его реакции на входные данные - все отрабатывает как должно
Почему у вас иное поведение - загадка

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

Сообщение Vlad5503 » 2017-09-08 3:35:02

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

А в чём загадочная?
Ставил freebsd 10.3 на рейд-1. На неё ставил ПО через Pkg.

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

Сообщение harmless » 2017-09-07 14:47:13

Используйте готовые модули - http://search.cpan.org/~drolsky/Data-Validate-IP-0.27/lib/Data/Validate/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на валидность.

Сообщение 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 нету на текущий момент. Появиться потребность - будем дорабатывать скрипт.

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

Сообщение f_andrey » 2017-09-04 14:36:45

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

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

2001:db8::ab9a:1

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

Проверка 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 адрес

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

Проверка 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") }


Выдает "...правильный адрес"
Не подскажете, что я не так сделал.

Вернуться к началу