Перейти к содержимому
Калькуляторы

Помогите, кто в перле шарит ?

 

Добавь

use utf8;

#!/usr/bin/perl

use utf8;

use strict;
use warnings;

use Net::IDN::Encode ':all';
use URL::Encode ':all';


my $U = 'http://сптр-в-орске.рф/доставка-алкоголя-503752.htm';

$U =~ /http\:\/\/(.+)\/(.+)$/;

my $domain      = domain_to_ascii($1);
my $url         = url_encode_utf8($2);

print "$domain/$url\n";

 

Вывод:

xn-----elcnyxdiedhf.xn--p1ai/%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0-%D0%B0%D0%BB%D0%BA%D0%BE%D0%B3%D0%BE%D0%BB%D1%8F-503752.htm

Изменено пользователем KsenZ

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ладно, наверное пора уже весь исходник выложить. Он работает с ошибкой:

 

time /usr/bin/xml2 < /opt/zapret-info/dump.xml | ./ziparser.pl > url3
disallowed character U+0081 at /usr/local/lib/perl/5.14.2/Net/IDN/Encode.pm line 46.

real    0m3.540s
user    0m3.428s
sys     0m0.111s

 

сколько-то url успевает разобрать. Это далеко не финальная версия.

 

Запускать так:

time /usr/bin/xml2 < /opt/zapret-info/dump.xml ./ziparser.pl | uniq > ./url

 

Код ziparser.pl, засада в последнем цикле for, в самом конце:

#!/usr/bin/perl

use strict;
use warnings;

use utf8;                               # for UTF8 to work correctly
binmode(STDOUT,':utf8');                # for removing warnings about wide chars

use Net::Netmask;                       # for ip address list aggregation
use Net::IDN::Encode 'domain_to_ascii'; # convert to punycode
use URL::Encode 'url_encode_utf8';      # encode national symbols to %bla-bla


our $acl = "ZAPRETINFOHTTPS";           # name of ACL in cisco router (border router, not SCE)
our $httpsipfile = "ACL";               # for test
#our $httpsipfile = "/home/sce/upload/$acl"; # text file with "ZAPRETINFOHTTPS"

our @httpsip    = (); # https disabled ips
our @httpurl    = (); # disabled http:// urls
our @domainip   = (); # ips of disabled domains

our $list       = {}; ##
our @dumpa      = (); # for Net::Netmask aggregation and ...
our @dumpa2     = (); ##

our $U          = ""; # variable for URL

# we do not use xml modules and we precess plain output from /usr/bin/xml2
# so we use flags, variables and workflow

# flags and variables for workflow
our $ip = 0; our $https = 0; our $domain = 0; our $t;

while (<>) {
 # http:// url
 if ( /content\/url=http\:\/\/(.+)$/ )     { 
   my $u = $1; $u =~ s/\:/\\\:/;
   push @httpurl,"http://".$u; next;
 }

 # reset flags if find new id
 if ( /content\/\@id=\d+$/ ) { $ip = 0; $https = 0; $domain = 0; next;}

 # set flags if find domain, ip or https
 if ( /content\/\@blockType=domain$/ ) { $domain = 1; next;}
 if ( /content\/\@blockType=ip$/ )     { $ip     = 1; next;}
 if ( /content\/url=https\:/ )         { $https  = 1; next;}

 # do actions if flags are set
 if ( $domain == 1 && /content\/domain=(.+)$/ ) { push @httpurl,"http://".$1."/*"; next; }
 if ( $domain == 1 && /content\/ip=(.+)$/ )     { push @domainip,$1; next;}
 if ( $ip == 1 && /content\/ip=(.+)$/ )         { push @domainip,$1; next;}
 if ( $https == 1 && /content\/ip=(.+)$/ )      { push @httpsip,$1 ; next; }
}

# Here xml is parsed and massives are filled up

# open ACL file for write
open(my $httpsiph,  '>', $httpsipfile );

# write HEAD of ACL file (delet ACL from  internal interfaces)
print $httpsiph "interface Port-channel1.1\n no ip access-group $acl in\nexit\n";
print $httpsiph "interface Port-channel2.1\n no ip access-group $acl in\nexit\n";
print $httpsiph "no ip access-list extended $acl\n";
print $httpsiph "ip access-list extended $acl\n";

# Try to aggregate single ips into networks to reduse nubmber of acl records (ace-s)
for($t=0;$t<=$#httpsip;++$t) {
 my $block = new Net::Netmask($httpsip[$t]);
 $block->storeNetblock( $list);
}
@dumpa = dumpNetworkTable($list);@dumpa2 = cidrs2cidrs(@dumpa);
for($t=0;$t<=$#dumpa2;++$t) {
 my $block = new Net::Netmask($dumpa2[$t]);
 print $httpsiph " deny tcp any ",$block->base()," ",$block->hostmask()," eq 443","\n";
}
@dumpa = (); @dumpa2 = (); $list = {};

for($t=0;$t<=$#domainip;++$t) {
 my $block = new Net::Netmask($domainip[$t]);
 $block->storeNetblock( $list);
}
@dumpa = dumpNetworkTable($list);@dumpa2 = cidrs2cidrs(@dumpa);

# here we have aggregated ip-addresses of https urls in @dumpa2

# write acl rules to ACL file
for($t=0;$t<=$#dumpa2;++$t) {
 my $block = new Net::Netmask($dumpa2[$t]);
 print $httpsiph " deny tcp any ",$block->base()," ",$block->hostmask()," eq 443","\n";
}
@dumpa = (); @dumpa2 = (); $list = {};

# write END of ACL file  and setup ACL to internal interfaces
print $httpsiph " permit ip any any\n";
print $httpsiph "exit\n";
print $httpsiph "interface Port-channel1.1\n ip access-group $acl in\nexit\n";
print $httpsiph "interface Port-channel2.1\n ip access-group $acl in\nexit\n";

# close ACL file
close $httpsiph;

# make urls and print them to STDOUT (then use uniq for historical reasons :-))
my @sortedhttpurl = sort @httpurl;
for($t=0;$t<=$#sortedhttpurl;++$t) {
#       print $sortedhttpurl[$t]."---\n";
#       print "# ".$sortedhttpurl[$t]." :\n";

       $U = ""; $U = $sortedhttpurl[$t];

#       $U =~ /http\:\/\/(.+)(\/)?(.+)?$/;

       # this regex was taken from internet ...
       if ($U =~ m!^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?!) {
               my($host,$path) = ($4,$5);
               my($h,$p) = ( domain_to_ascii($host),url_encode_utf8($path) );
               print "http://$h/$p\n";
       }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Использую парсер о многоуважаемого max1976

Но скоро от sce буду уходить на extfilter (пока на тесте)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но скоро от sce буду уходить на extfilter (пока на тесте)

Вот за это спасибо!

Судя по описанию, действительно стоящая и отличная разработка, даже HTTPS блокирует!

И как по тестам? Все блокирует?

 

С ходу не совсем понял, как ее внедрить. Так же как SCE, в "разрыв" трафика?

Изменено пользователем KsenZ

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но скоро от sce буду уходить на extfilter (пока на тесте)

Вот за это спасибо!

Судя по описанию, действительно стоящая и отличная разработка, даже HTTPS блокирует!

И как по тестам? Все блокирует?

 

С ходу не совсем понял, как ее внедрить. Так же как SCE, в "разрыв" трафика?

Ну пока от ревизора нарушений нет.

Вешается одной сетевухой на зеркало, второй просто в сеть

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как сказал один из сотрудников если у вас установлен программный ревизор вас не привлекут к ответственности т.к. он не сертифицированный. А если у вас аппаратное решение, то уже были случай привлечения оператора.

 

Уже ж всем эти тп-линки перепрошитые поставили... не суть.

 

Нам предложили поставить программный вместо аппаратного, после чего мы аппаратный сдали, так зачем тогда все кричат не ставьте программный если с этого один профит, вы и с ркн как бы не поругались и привлечь вас не могут как-будто бы

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пока так получилось:

#!/usr/bin/perl

use strict;
use warnings;

use utf8;                               # for UTF8 to work correctly
####binmode(STDOUT,':utf8');            # for removing warnings about wide chars
use open ':std', ':encoding(utf-8)';

use Net::Netmask;                       # for ip address list aggregation
use Net::IDN::Encode 'domain_to_ascii'; # convert to punycode
use URL::Encode 'url_encode_utf8';      # encode national symbols to %bla-bla


our $acl = "ZAPRETINFOHTTPS";           # name of ACL in cisco router (border router, not SCE)
our $httpsipfile = "ACL";
#our $httpsipfile = "/home/sce/upload/$acl"; # text file with "ZAPRETINFOHTTPS"

our @httpsip    = (); # https disabled ips
our @httpurl    = (); # disabled http:// urls
our @domainip   = (); # ips of disabled domains

our $list       = {}; ##
our @dumpa      = (); # for Net::Netmask aggregation and ...
our @dumpa2     = (); ##

our $U          = ""; # variable for URL

# we do not use xml modules and we precess plain output from /usr/bin/xml2
# so we use flags, variables and workflow

# flags and variables for workflow
our $ip = 0; our $https = 0; our $domain = 0; our $t;

while (<>) {

 # http:// url match here
 if ( /content\/url=http\:\/\/(.+)$/ )     { 
   my $u = $1; $u =~ s/\:/\\\:/;
   push @httpurl,"http://".$u; next;
 }

 # reset flags if find new id
 if ( /content\/\@id=\d+$/ ) { $ip = 0; $https = 0; $domain = 0; next;}

 # set flags if find domain, ip or https
 if ( /content\/\@blockType=domain$/ ) { $domain = 1; next;}
 if ( /content\/\@blockType=ip$/ )     { $ip     = 1; next;}
 if ( /content\/url=https\:/ )         { $https  = 1; next;}

 # do actions if flags are set
 if ( $domain == 1 && /content\/domain=(.+)$/ ) { push @httpurl,"http://".$1."/*"; next; }
 if ( $domain == 1 && /content\/ip=(.+)$/ )     { push @domainip,$1; next;}
 if ( $ip == 1 && /content\/ip=(.+)$/ )         { push @domainip,$1; next;}
 if ( $https == 1 && /content\/ip=(.+)$/ )      { push @httpsip,$1 ; next; }
}

# Here xml is parsed and massives are filled up

# open ACL file for write
open(my $httpsiph,  '>', $httpsipfile );

# write HEAD of ACL file (delet ACL from  internal interfaces)
print $httpsiph "interface Port-channel1.1\n no ip access-group $acl in\nexit\n";
print $httpsiph "interface Port-channel2.1\n no ip access-group $acl in\nexit\n";
print $httpsiph "no ip access-list extended $acl\n";
print $httpsiph "ip access-list extended $acl\n";

# Try to aggregate single ips into networks to reduse nubmber of acl records (ace-s)
for($t=0;$t<=$#httpsip;++$t) {
 my $block = new Net::Netmask($httpsip[$t]);
 $block->storeNetblock( $list);
}
@dumpa = dumpNetworkTable($list);@dumpa2 = cidrs2cidrs(@dumpa);
for($t=0;$t<=$#dumpa2;++$t) {
 my $block = new Net::Netmask($dumpa2[$t]);
 print $httpsiph " deny tcp any ",$block->base()," ",$block->hostmask()," eq 443","\n";
}
@dumpa = (); @dumpa2 = (); $list = {};

for($t=0;$t<=$#domainip;++$t) {
 my $block = new Net::Netmask($domainip[$t]);
 $block->storeNetblock( $list);
}
@dumpa = dumpNetworkTable($list);@dumpa2 = cidrs2cidrs(@dumpa);

# here we have aggregated ip-addresses of https urls in @dumpa2

# write acl rules to ACL file
for($t=0;$t<=$#dumpa2;++$t) {
 my $block = new Net::Netmask($dumpa2[$t]);
 print $httpsiph " deny tcp any ",$block->base()," ",$block->hostmask()," eq 443","\n";
}
@dumpa = (); @dumpa2 = (); $list = {};

# write END of ACL file  and setup ACL to internal interfaces
print $httpsiph " permit ip any any\n";
print $httpsiph "exit\n";
print $httpsiph "interface Port-channel1.1\n ip access-group $acl in\nexit\n";
print $httpsiph "interface Port-channel2.1\n ip access-group $acl in\nexit\n";

# close ACL file
close $httpsiph;
# make urls and print them to STDOUT (then use uniq for historical reasons :-))
my @sortedhttpurl = sort @httpurl;
for($t=0;$t<=$#sortedhttpurl;++$t) {
       $U = ""; $U = $sortedhttpurl[$t];

       # check for non-ASCII chars in url
       if($U =~ /[^!-~\s]/g) {
               if ($U =~ m!^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?!) {
                       my($host,$path) = ($4,$5);
                       chomp($host) ; chomp($path); $path =~ s/^\/// ;
                       my($h,$p) = ( domain_to_ascii($host),url_encode_utf8($path) );
                       print "http://$h/$p\n";
               }
       } else {
               print "$U\n";
       }
}

 

Но при заливке файла с выводом этого скрипта выдаются такие ошибки:

Error - Internal error, Input concatenated Key String are not valid: 195.2.252.170\:/music/%D0%9C%D0%A3%D0%A1%D0%90%20%D0%90%D0%91%D0%A3%20%D0%AE%D0%A1%D0%A3%D0%A4.html:*:*
Error - Internal error, Input concatenated Key String are not valid: 195.2.252.170\:/music/%D0%9C%D1%83%D1%81%D0%B0%20%D0%90%D0%B1%D1%83%20%D0%AE%D1%81%D1%83%D1%84.html:*:*
Error - Internal error, Input concatenated Key String are not valid: 27.255.83.149\:/:*:*
Error - Internal error, Input concatenated Key String are not valid: 37.139.28.143\:/:*:*

 

Опять какая-то лажа в реестре. Напрмиер, там естьтакой url: "http://37.139.28.143\:8001/"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как сказал один из сотрудников если у вас установлен программный ревизор вас не привлекут к ответственности т.к. он не сертифицированный. А если у вас аппаратное решение, то уже были случай привлечения оператора.

 

Уже ж всем эти тп-линки перепрошитые поставили... не суть.

 

Нам предложили поставить программный вместо аппаратного, после чего мы аппаратный сдали, так зачем тогда все кричат не ставьте программный если с этого один профит, вы и с ркн как бы не поругались и привлечь вас не могут как-будто бы

У меня один встречный вопрос. Вот поломался у вас сервер, ревизор не работает. Чьи это будут проблемы, что вас нельзя протестировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Конечно ваши проблемы. Размещая ПО на своих мощностях вы отвечаете за его работу.

Проблемы негров шерифа не еб...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Конечно ваши проблемы. Размещая ПО на своих мощностях вы отвечаете за его работу.

Проблемы негров шерифа не еб...

 

Мы им виртуалку сделали, РКН это устроило. Было несколько раз, что они с каких-то других ip хотели зайти на виртуалку и запустить проверялку, но фаервол их не пустил. Они позвонили, мы им рассказали, что в целях безорасности и всё такое, они поняли, сказали доп. адреса и всё.

 

 

Тут это ... у нас SCE почему-то раньше зашлушку показывала, а теперь не показывает :-). Было несколько апгрейдов версий firefox и chrome. Это с этим связано ? Сейчас фф пишет "соединение разорвано" (быстро такое сообщение выдаёт), в логах на сервере с заглушкой нет ip, с которого тестирую.

 

Пащему так ? :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Sce работает как блокирование ркн + dpi + шейпер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Sce работает как блокирование ркн + dpi + шейпер?

Ви таки не повегите... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Только сце уже не круто. Я так понимаю нужно в сторону отечественного смотрет сейчас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Удалось кому-нибудь сделать блокировку на SCE https-трафика по адресам?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Удалось кому-нибудь сделать блокировку на SCE https-трафика по адресам?

дык только по адресам и удалось....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тьфу, не совсем корректно сформулировал. Имелась ввиду блокировка по именам https-хостов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тьфу, не совсем корректно сформулировал. Имелась ввиду блокировка по именам https-хостов.

нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, SCE в упор не хочет фильтрвать такой флейвор:

 

mp3.get.az / * q=%D0%B1%D0%B0%D0%B3%D0%B0%D1%83%D0%B4%D0%B4%D0%B8%D0%BD+%D0%BC%D1%83%D1%85%D0%B0%D0%BC%D0%BC%D0%B0%D0%B4+%D0%94%D0%BE%D0%B2%D0%BE%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE+%D0%BA%D0%B0%D1%84%D0%B8%D1%80%D1%81%D0%BA%D0%B8%D0%BC+%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%BE%D0%BC

 

Вот че ему надо?

Есть еще несколько.

 

Причем есть куча других, также имеющих в себе %D0%xx в теле урла и все нормально фильтруется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, SCE в упор не хочет фильтрвать такой флейвор:

 

mp3.get.az / * q=%D0%B1%D0%B0%D0%B3%D0%B0%D1%83%D0%B4%D0%B4%D0%B8%D0%BD+%D0%BC%D1%83%D1%85%D0%B0%D0%BC%D0%BC%D0%B0%D0%B4+%D0%94%D0%BE%D0%B2%D0%BE%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE+%D0%BA%D0%B0%D1%84%D0%B8%D1%80%D1%81%D0%BA%D0%B8%D0%BC+%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%BE%D0%BC

 

Вот че ему надо?

Есть еще несколько.

 

Причем есть куча других, также имеющих в себе %D0%xx в теле урла и все нормально фильтруется.

Какому урлу в базе это соответствует?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Какому урлу в базе это соответствует?

 

313761

 

 <content id="313761" includeTime="2016-08-01T16:18:01"
 urgencyType="1" entryType="3"
 hash="5277165C20EDD7D09790C063B7E2876C">
   <decision date="2016-06-24" number="27-31-2016/Ид2781-16"
   org="Генпрокуратура" />
   <url>
     <![CDATA[http://mp3.get.az/?q=%D0%B1%D0%B0%D0%B3%D0%B0%D1%83%D0%B4%D0%B4%D0%B8%D0%BD+%D0%BC%D1%83%D1%85%D0%B0%D0%BC%D0%BC%D0%B0%D0%B4+%D0%94%D0%BE%D0%B2%D0%BE%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE+%D0%BA%D0%B0%D1%84%D0%B8%D1%80%D1%81%D0%BA%D0%B8%D0%BC+%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%BE%D0%BC]]>
</url>
   <domain>
     <![CDATA[mp3.get.az]]>
</domain>
   <ip>163.172.30.112</ip>
 </content>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. 277 символов, длиновато, но вроде не критично, насколько я помню суммарная длина всех ключей - 512 байт...

2. После ? знака идут параметры запроса (query parameters) он и составляет основную часть URL

Есть ли ограничение на распределение 512 байт между ключами - не знаю, а так тупо в лоб вроде корректно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У SCE лимит длины ссылки, в 277 это 100% много. Где-то на форуме уже называли максимальную длину

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, хорошая идея ограничится суммарной длинной полей flavor 250 символами, обрезать самый длинный ключ, в данном случае query parameters и поставить * в конце.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, хорошая идея ограничится суммарной длинной полей flavor 250 символами, обрезать самый длинный ключ, в данном случае query parameters и поставить * в конце.

мы даже ещё больше режем и в конце *. Народ сейчас гораздо "лояльнее" воспринимает блокировки и уже как год назад не звонят провайдеру и не кричат недовольным голосом. Все уже понимают, что это не прихоть провайдеров...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, попробую подсократить. Ревизор в основном на супердлинные ссылки и ругается.

А вот на сколько критично звездочкой попасть за окончание юникод-символа %D0%xx пофиг или не пофиг?

Т.е. вот переводит SCE внутри себя ссылку в юникод или нет? Ваши парсеры как поступают?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.