СтатьиПрограммирование

Гостевая книга на perl: последние штрихи.
n0xi0uzz
14 февраля 2008 12:25



Теги: perl, guest book

Итак, предположим, что вы пишете гостевую на perl и столкнулись с такой проблемой: гостевая готова, все работает, но чего-то не хватает, а именно - гостевая слишком проста. Вам хочется сделать её более "навороченной". Что ж, попробую показать вам, как можно легко, используя стандартные средства perl, сделать вашу гостевую лучше.

Часть первая. Избавляемся от мата.

Вам надоело, что всякие уроды матерятся у вас в гостевой? Сейчас я покажу, как очень легко можно сделать защиту от мата.

Для начала, создайте какой-нибудь текстовой файл, например, bad_words.dat, в котором пропишите корни всех матов - не сами маты, а именно их корни. Если вы не знаете, как найти корень слова, сходите в ближайшую среднюю школу, найдите там учителя русского языка и попросите объяснить.

Ладно, предположим, что корни слов-матов вы смогли выделить и записали их в текстовик построчно. Теперь небольшой кусочек кода, который заменит подобные корни будет заменять в словах, например, на "[цензура]".

Для начала, откроем созданный нами текстовик и загоним все его строки в один массив, например в @bad_w:

open BADW, "bad_words.dat";
@bad_w = ;
close BADW;

Затем, используя цикл foreach и оператор подстановки s///, легко и просто заменим все маты:

foreach $bad_w (@bad_w){
$bad_w=~ s/\r|\n//g;
$msg=~ s/$bad_w/[цензура]/g; #замена матов в сообщении
$nick=~ s/$bad_w/[цензура]/g; #замена матов в нике
}

Получается, что переменная $bad_w - это каждая строка из массива @bad_w, то есть корень слова-мата, везде, так как используется глобальный модификатор шаблона /g, заменяется на "[цензура]". Вот, в принципе, и всё с этим.


Часть вторая. Вешаем баны.

Итак, маты мы убрали. Но существуют такие люди, которые любят пофлудить, пооффтопить и позаниматься прочей гадостью. Заменять такую гадость вышеизложенным способом, естественно, нерационально. Проще закрыть доступ к гостевой таким людям. Нет, пусть они читают сообщения и кусают локти, а сообщения они добавлять не смогут. Сейчас я покажу, как это сделать.

Для начала, узнаем IP-адрем заходящего в вашу гостевую книгу. В этом нам поможет стандартная переменная окружения в perl:
$ip = $ENV{'REMOTE_ADDR'};
Затем, нам опять же надо создать текстовой файл, например, bans.dat, в котором построчно прописать те IP-адреса, добавления сообщений с которых нежелательно.

Создав подобный файл, перенесем все IP-адреса, прописанные там в массив, например, в @bans:
open BANS, "$bans";
@bans = ;
close BANS;

Теперь будем сравнивать каждый IP-шник из файла с переменной $ip, используя циклы foreach и if и если забаненный IP будет равен текущему IP, присвоим какой-нибудь переменной, например $ok, какое значение, например "BAD":
foreach $ban (@bans){
$ban=~ s/\r|\n//g;
if ($ip eq $ban){
$ok = "BAD";
print "";
}
}

И теперь, при добавлении этого сообщения, если переменная $ok будет равна "BAD", это сообщение добавляться не будет. Для этого, в условиях добавления сообщения, напишите примерно так:

if ($ok ne "BAD"){#добавляем сообщение}


Часть третья. Защита от флуда на F5.

Теперь мы защитимся от флуда на обновление страницы. Хоть и можно добавить адрес флудера в список банов, очищать гостевую от флуда не всегда приятно, так ведь?

Итак, сделаем так: при нажатии F5 (либо же кнопочки "обновить") после добавлении сообщения, это сообщение добавляется ещё раз, что, конечно же, нежелательно. Поэтому мы каждое новое сообщение при добавлении будем сравнивать с предыдущим, и, если оно будет равно ему, так же, как и во второй части, присвоим переменной $ok параметр "BAD". А что дальше делать с этой $ok я уже показал.Итак, приступим. Откроем файл, в котором хранятся сообщения гостевой и из последней строки, используя стандартную функцию языка split, вычислим последнее сообщение:

open FILE, "$file";
@abc = ;
close FILE;
($nick_last, $ip_last, $msg_last)= split(/;;;;;/, $abc[@abc-1]);
$msg_last=~ s/\r|\n//g;

Как вы уже, наверное догадались, все сообщения мы загрузили в массив @abc, потом из последней строки, $abc[@abc - 1], зная, что разделитель у нас между ником, IP-адресом и сообщением, узнали последнее сообщение - $msg_last. Теперь, используя цикл if, сравним последнее сообщение с добавляемым, и, если результат сравнения положителен, присвоим $ok значение "BAD":

if ($msg_last eq $msg){$ok="BAD";}

Дальше вы уже знаете, что делать, по примеру из второй части.

Эпилог. Выводы и всё такое...

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

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

if ($nick eq ""){$nick = "Аноним";}

То есть, если параметр $nick пуст, присваиваем ему значение "Аноним".

Также можно сделать ограничение на количество вводимых символов в сообщении, чтобы слишком много не писали вам, используя функцию substr:

$msg= substr($msg, 0, 1024);

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

Удач!




Теги: perl, guest book

Статьи с такими же тегами:

Клиент для LiveJournal.com на Perl
Система авторизации по переменным окружения.
Обработка PDF на Perl.
Использование AJAX в Perl.
Выбирая шаблонизатор на Perl.