Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Spearance 30.03.2005 14:56
Для нерегулярных читателей хочу напомнить что в примерах появился интересный класс антифлуд или как я его называю антидаблпостинг.# $Id: verify.p,v 1.0.4.0 2005/03/29 Eugene Spearance Exp $ @USE antiflood.p @CLASS verify @BASE antiflood @auto[] # Перекрываем значения переменных из antiflood.p $DOUBLE_FILE[_antidouble] $EXPIRES_UID(1/(24*2)) ######################################## # Метод перекрывающий @get[] из antiflood.p ##### @get[_uid][_number] ^BASE:_anti_cache[] ^if(def $_uid){ $UID[$_uid] }{ $_number[^_random_number[]] $VISITOR[^BASE:_visitor[]] $UID[^BASE:_get[$VISITOR]] ^if(!def $UID){ ^rem{ *** генерим uid *** } $UID[^BASE:_generate[]] ^rem{ *** сохраняем его в хешфайле *** } ^BASE:_set[$UID;$_number;$EXPIRES_UID] ^rem{ *** сохраняем какой uid был выдан данному посетителю последний разб чтобы если он *** } ^rem{ *** положит на F5 что-нить тяжелое и пойдет на обед он не зафлудил бы нам сильно хешфайл *** } ^BASE:_set[$VISITOR;$UID;$EXPIRES_VISITOR] } } $result[$UID] ### @get[] ######################################## # Метод перекрывающий @exec[] из antiflood.p ##### @exec[number;code] ^BASE:_open[] ^file:lock[$DATA_DIR/$LOCK_FILE]{ ^if(^BASE:_get[$UID] eq $number){ ^rem{ *** в хешфайле есть соответствующий uid - выполняем код *** } $code ^BASE:_delete[$UID] ^BASE:_delete[$VISITOR] }{ ^rem{ *** э, князь, ты не прав: не знаем мы ничего про такой uid, до свидания *** } ^throw[antiflood;Unknown UID] } } #end @exec[] ######################################## @_random_number[] $result(^math:random(99999)) $result[^result.format[%05u]] ### End @_random_number[] ######################################## # Выводит заданное число в виде картинки ##### @display_image[uuid;img_path][image;image_number;file_name] ^if(def $img_path){$img_path[^img_path.match[(.+?)/?^$][m]{$match.1}]} $image[^image::create(100;20;0xFFFFFF)] ^try{ ^rem{ *** Если $uuid не задан, будет выведена пустая картинка *** } $check[^BASE:_get[$uuid]] ^rem{ *** Картинки с номерами имеют названия fsXY.gif, где X - номер на картинке, *** } ^rem{ *** а Y - вариант. Число может быть представлено любой картинкой, чтобы *** } ^rem{ *** затруднить распознавание автоматическими средствами. *** } ^for[i](0;4){ $file_name[fs^math:random(9)^check.mid($i;1)] $image_number[^image::load[$img_path/${file_name}.gif]] ^rem{ *** Накладываем картиноку на фон *** } ^image.copy[$image_number](0;0;20;20;^eval($i*20);0) } }{ $exception.handled(1) ^image.line(0;0;99;19;0xDDDDDD) ^image.line(99;0;0;19;0xDDDDDD) ^image.rectangle(0;0;99;19;0xDDDDDD) } $response:body[^image.gif[]] ### End @display_image[]Что необходимо для работы:
@USE verify.p @main[] ^verify:display_image[$form:uuid;путь_к_папке_с_номерками]Чтобы не делать блокировку картинок в .htaccess картинки можно положить вне веб пространства.
RewriteEngine On RewriteRule ^uuid_(.*)\.gif$ /путь_к файлу_от_корня/img.html?uuid=$1 [L]3. Вставить в нужное место код
@USE verify.p ########################################################################### @main[] # получаем uid $uid[^verify:get[$form:uid]] $is_show_form(1) # пришло $form:uid - постят форму ^if(def $form:uid){ ^try{ ^verify:exec[$form:number]{ ^rem{ *** проверяем все-ли в форме заполнено как надо *** } ^check[] ^rem{ *** тут ваш код по добавлению пришедших данных куда вам больше хочется *** } <p>Ваше сообщение было успешно добавлено.</p> $is_show_form(0) } }{ ^if($exception.type eq "antiflood"){ $exception.handled(1) <p>Неверно набран номер с картинки.</p> $is_show_form(0) } ^if($exception.type eq "check"){ $exception.handled(1) <p>Не заполнены обязательные поля формы.</p> } } } # если надо - показываем форму ^if($is_show_form){ <form method="post"> <input type="hidden" name="uid" value="$uid" /> <i>* Имя:</i><br /> <input type="text" name="name" value="$form:name" /><br /> <i>E-mail:</i><br /> <input type="text" name="email" value="$form:email" /><br /> <i>Сообщение:</i><br /> <textarea name="text">$form:text</textarea><br /> <i>Введите номер с картинки:</i><br /> <input type="text" name="number" size="5" maxlength="5" /> <img src="/uuid_${uid}.gif" width="100" height="20" alt="включите поддержку картинок" /> <input type="submit" name="action" value="Отправить" /> </form> } #end @main[] ########################################################################### @check[] ^if(!def $form:name){ ^throw[check;Не заполнены обязательные поля формы.] } #end @check[]Вот собственно и всё. Использование этих классов, позволяет избавиться от базы данных.