Previous Entry Share Next Entry
Весеннее обострение
shixaro wrote in opentorrent
Каждый год весной у людей что-то происходит с головой. Иногда всплывают клинические неадекваты. В этом году сезон открыл абонент дом.ру (как оказалось позже, он же - счастливый обладатель выделенки от АБВ и "свистка" от МТС) из Нижнего Новгорода. В пхпбб есть блок по IP-адресам. Но мы выстругали, подобно папе Карло, своего Буратину, который умеет заворачивать сетки одним поворотом деревянного носа.


tracker=# create table banned_networks (network cidr, descr text, status integer not null default 1);
CREATE TABLE
tracker=# insert into banned_networks values (network, descr) values ('95.79.0.0/16', 'Нижегородский дом.ру. Динамика. Оттуда регистрируется пользователь и пишет на форуме мат');
INSERT 0 1
tracker=#


Пишем функцию на перле с использованием мемкэша:


CREATE FUNCTION check_banned_networks(cidr) RETURNS integer AS $$
use Cache::Memcached;
use Net::IPv4Addr qw( :all );
my ($ip) = @_;
my $ttl=600;
my $key='check_banned_networks_'.$ip;
my $cache = Cache::Memcached->new({servers => ["192.168.200.1:63922"], debug => 0});
my $status, $row;
if ( defined($cache->get($key)) ) {$status=$cache->get($key);}
else
{
my $sth = spi_query("SELECT network FROM banned_networks WHERE status=1");
while (defined ($row = spi_fetchrow($sth))) {
if (ipv4_in_network($row->{network}, $ip ) ) {$status=1; break;}

}
$status=0 if !$status;
$cache->set($key, $status, $ttl);
}
$cache->disconnect_all;
return $status;
$$ LANGUAGE plperlu;


Результат работы:


tracker=# SELECT check_banned_networks('95.79.139.117');
check_banned_networks
-----------------------
1
(1 row)

tracker=# SELECT check_banned_networks('92.55.55.55');
check_banned_networks
-----------------------
0
(1 row)



Нужно еще expire_dt добавить, чтобы бан грохался по шедулеру.

?

Log in