Биллинговая система Nodeny
29 Сентября 2024, 01:31:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: Nodeny не проверяет уникальность ip-адресов!  (Прочитано 5684 раз)
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1227

In LAN we trust!

358714596
Просмотр профиля
« : 21 Ноября 2011, 12:51:53 »

Попробуйте создать клиента с ип 10.10.10.5, а потом с ип 10.10.10.005
Улыбающийся
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4787



Просмотр профиля
« Ответ #1 : 21 Ноября 2011, 13:14:31 »

Попробуйте создать клиента с ип 10.10.10.5, а потом с ип 10.10.10.005
Улыбающийся
в данном случае баг не с тем, что это одинаковые ip, а с тем, что 2й ip по сути некорректен (не вообще, а в пределах NoDeny ибо ip воспринимаются/сравниваются как строки). Щас посмотрю что нужно подправить
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4787



Просмотр профиля
« Ответ #2 : 21 Ноября 2011, 13:23:21 »

быстрее всего в голову пришло такое:

в user.pl в

Код:
sub check_ip
{
    $F{ip} =~ s/\.0+([^0\.]+)/\.$1/g;

щас тока протещу, а то до этого ахинею написал)

Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1227

In LAN we trust!

358714596
Просмотр профиля
« Ответ #3 : 21 Ноября 2011, 13:25:09 »

так, а при создании нового пользователя, проверка будет работать или надо еще где-то ее вставить?
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4787



Просмотр профиля
« Ответ #4 : 21 Ноября 2011, 13:33:26 »

Придумал аццкий регексп:

Код:
s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;

Проверка:
Код:
foreach my $ip qw(
        0.0.0.0
        10.0.0.1
        0010.1.2.30
        020.000030.04.05
        1.2.3.4
        123.0.234.000
){
        $_ = $ip;
        s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;
        print "$ip -> $_\n";
}

выдает:

Цитировать
0.0.0.0 -> 0.0.0.0
10.0.0.1 -> 10.0.0.1
0010.1.2.30 -> 10.1.2.30
020.000030.04.05 -> 20.30.4.5
1.2.3.4 -> 1.2.3.4
123.0.234.000 -> 123.0.234.0

Насчет создания клиента - сейчас гляну

Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4787



Просмотр профиля
« Ответ #5 : 21 Ноября 2011, 13:40:09 »

Итого в user.pl после
Код:
sub check_ip
{

ставим:

Код:
  $F{ip} =~ s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;

В adduser.pl после
Код:
$Fip=&trim($F{ip});

ставим:

Код:
  $Fip =~ s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4787



Просмотр профиля
« Ответ #6 : 21 Ноября 2011, 14:19:36 »

На самом деле покрываются не все возможные варианты извращений. Более правильный вариант:

Код:
$F{ip} = join '.', map{ s/^0+(\d+)$/$1/; $_ } split /\./,$F{ip};

и

Код:
$Fip = join '.', map{ s/^0+(\d+)$/$1/; $_ } split /\./,$Fip;
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #7 : 21 Ноября 2011, 14:59:13 »

А найух регексп!?
Код:
$F{ip} = join '.', map{ int } split /\./,$F{ip};
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4787



Просмотр профиля
« Ответ #8 : 21 Ноября 2011, 15:39:43 »

А найух регексп!?
Код:
$F{ip} = join '.', map{ int } split /\./,$F{ip};
предполагал, что число с лидирующим нулем будет воспринято как восьмеричное:
Код:
print int(010);
выдаст 8.
Но оказывается, что в случае со строками, perl поступает иначе. Так что твой вариант лучше

Тогда проще так:

Код:
s/(\d+)/int $1/ge;
« Последнее редактирование: 21 Ноября 2011, 15:46:05 от Efendy » Записан
Страниц: [1]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!