Отправляет email-рассылки с помощью сервиса Sendsay

IP-ban

Кто-нибудь знает, как можно в Perl реализовать антифлуд по ip-адресу
отправителя?
Я знаю, что инфу о ip можно вынуть из $ENV{'REMOTE_ADDR'} но как
сделать так, чтобы с этого ip можно было отправить сообщение (читай
запустить скрипт) только раз в 5 минут?

--
Ilya Tatarnikoff
mailto:webmast***@r*****.com
ICQ number: 317134899
PGP key ID: 0x18EA20AE

Monday, April 11, 2005 - 8:28:59 PM





библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Ilya Tatarnikov Mon, 11 Apr 2005 20:34:01 +0800 (#348822)

 

Ответы:

Организуй файл или БД, в котором будешь хранить, какой IP когда
последний раз писал. А дальше проверка на 5 минут и все... Только не
забывай лочить файл, чтобы не писать параллельно из двух процессов...

Пашка

11 апреля 2005 г., 16:34:01, Ilya Tatarnikov <jackso***@r*****.com> wrote:












библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Mon, 11 Apr 2005 15:43:46 +0400 (#348830)

 


При отправке сообщения проверять есть ли данный ip в базе если нет, то
оправлять сообщение и ip заносить в базу. Если же есть то запрещать
отправку. Каждые пять минут cron'ом запускать скрипт очистки базы -
т.е. удалять все записи которые "состарились", т.е. их возраст больше
5 минут.

А вообще делай не 5 минут, а хотя бы 1 час. :-)

Ответить   Mon, 11 Apr 2005 16:44:01 +0400 (#348867)

 

Точно! На счет Cron'а - это хорошая идея!

Monday, April 11, 2005 - 8:44:01 PM, Begemot <begemotina20***@m*****.ru> wrote:







--
Regards,
Ilya Tatarnikoff
mailto:webmast***@r*****.com
ICQ number: 317134899
PGP key ID: 0x18EA20AE

Monday, April 11, 2005 - 9:56:30 PM





библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Ilya Tatarnikov Mon, 11 Apr 2005 21:57:46 +0800 (#348883)

 

На самом деле насчет крона - плохая идея. Получается слишком много не
зависящих друг от друга блоков у программы, которые еще к тому же
могут выполняться параллельно и это надо учитывать. Лучше удаление
старых записей сделать здесь же при проверке...

Пашка

11 апреля 2005 г., 17:57:46, Ilya Tatarnikov <jackso***@r*****.com> wrote:


















библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Mon, 11 Apr 2005 19:18:54 +0400 (#348960)

 

Пашка, это не плохая идея! Это реальность, которая с блеском показала
себя на практике, например, в проекте behidden.com
Я советую только то, что сам пробовал.




Ответить   Mon, 11 Apr 2005 21:14:29 +0400 (#349028)

 

Тоесть крон может очистить список ip в тот момент, когда скрипт
заносит туда запись? Да, точно.

Вот только до меня всё не доходит, как реализовать "рекламную паузу"
например, ну минут на 30.

Вот я тут что-то пытался сделать, но не получается проверка времени.

$ip = $ENV{'REMOTE_ADDR'};

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

open(BAN, "feedback-ban.dat");
while(<BAN>)
{
push(@ban, $_)
}
close(BAN);

foreach $line (@ban)
{
if (($line ~= /$ip/)
......
Если кто знает, как это реализовать, помогите! :)


Monday, April 11, 2005 - 11:18:54 PM, Пашка <pav***@l*****.ru> wrote:




























--
Regards,
Ilya Tatarnikoff
mailto:webmast***@r*****.com
ICQ number: 317134899
PGP key ID: 0x18EA20AE

Tuesday, April 12, 2005 - 7:43:39 PM





библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Ilya Tatarnikov Tue, 12 Apr 2005 19:49:51 +0800 (#349458)

 

Привет, Илья!

Совершенно непонятно, что именно у тебя не получилось, но твой кусок
кода я для себя исправил бы так:

$ip = $ENV{'REMOTE_ADDR'};

$min_time = time - 30 * 60;

open(BAN, "feedback-ban.dat");
while(<BAN>)
{
push(@ban, $_)
}
close(BAN);

foreach $line (@ban)
{
($ban_ip, $ban_time) = split(/\t/, $line);
if ($line == $ip && $ban_time > $min_time)
......

Пашка

12 апреля 2005 г., 15:49:51, Ilya Tatarnikov <jackso***@r*****.com> wrote:














































библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Tue, 12 Apr 2005 16:19:47 +0400 (#349513)

 

Здравствуйте, Ilya,

11 апреля 2005 г. в 16:34 Вы писали:

Очень легко сделать, если при этом данные хранятся в MYSQL. У меня так
сделано для таблицы, куда помещаются комментарии пользователей к
статьям:

"SELECT comm_id FROM site_comments WHERE comm_ip='".$this->remote_ip()."'
AND DATE_ADD(comm_dt, INTERVAL 5 MINUTE) > NOW()";

comm_dt - столбец с датой комментария, comm_ip - с айпишником.
Если запрос возвращает результат, значит отшиваем пользователя :)

Ответить   Yura Zemskov Tue, 12 Apr 2005 17:34:49 +0400 (#349696)

 

:)) Стыдно признаться, но MySQL для меня это что-то из области
мистики. Страшный, непонятный зверь. :)))

Tuesday, April 12, 2005 - 9:34:49 PM, Yura Zemskov <yz@t*****.ru> wrote:






--
Ilya Tatarnikoff
mailto:webmast***@r*****.com
ICQ number: 317134899
PGP key ID: 0x18EA20AE

Wednesday, April 13, 2005 - 2:07:20 PM





библиотекa сайтостроительства http://www.i2r.ru/static/244/

Ответить   Ilya Tatarnikov Wed, 13 Apr 2005 14:10:02 +0800 (#349942)