parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Покритикуйте защиту от reload/back при отправке формы

Ден 24.04.2007 07:39

С Парсером работаю недавно и вот столкнулся с задачей защиты от дублирования данных при reload/back формы. Посмотрев форум и др. подходящих рецептов для этого чтото не нашел. Видел пример feedback на сайте, но там защиты от back нет. Вообщем решил задачку следующим образом: из пришедшего запроса с данными формы делается MD5 хэш. и сравнивается с предыдущим значением, сохраненным ранее в файле (в файле потому, что как я понял из документации, глобальных переменных сохраняемых парсером между отдельными обращениями к странице, не существует). Если хэши разные, то данные добавляются, если одинаковые, то показывается сообщение о том, что эти данные уже добавлены.
Вообщем все вроде работает, но хотелось бы услышать критику знатоков Парсера. Сам могу предположить только, что это схема будет неплохо работать на сайтах с небольшой нагрузкой (какой и создается),т.к. файловые операции всеж не быстрые сами по себе.
Из замеченных проблем скрипта: почему-то притестироании на Денвере, когда еще нет файла с хэшем, при первом запуске, исключение при попытке считывания файла обрабатывается нормально,без ошибок сервера, файл создается и далее все идет корректно.
А тоже самое на хостинге ( мастерхост.ру ) привело к ошибочной странице (но файл всеж создался) и только после релоада все стало нормально... Может какие-то нюансы не учитываю?

собственно сам скрипт защиты:

#таблица с новостями
$news[^table::load[/news/news.cfg]]

#анализ данных формы
^if($form:act eq 'do'){
#считается хэш пришедшего запроса
$thisreq[^math:md5[$request:body]]
#читаеся файл содержащий хэш предыдущего запроса
^try{ $lastreq[^file::load[text;/lastreq.txt]] }{
$lastreq[^file::create[text;/lastreq.txt;]]
^lastreq.save[text;/lastreq.txt]
}
#сравнение хэшей
^if($lastreq.text eq $thisreq){
<h3>Эти данные уже добавлены.</h3>
}{
#если хэши, а значит и данные формы, разные -то добавляем их
$datestr[$form:newsdate]
$outstr[$form:newstext]
^if(^datestr.length[] > 0){
^if(^outstr.length[] > 0){
^news.append{^datestr.match[\n][g]{<br/>} ^outstr.match[\n][g]{<br/>}}
^news.save[/news/news.cfg]
^thisreq.save[/lastreq.txt]
$ShowMyForm(0)
<h3>Данные добавлены.</h3>
}{<h3>Не заполнено поле новости.</h3> }
}{<h3>Не заполнено поле даты.</h3> }
}
}{ $ShowMyForm(1) }

#показ формы
^if($ShowMyForm){
<div style="padding-bottom:10px" class="bigtext">Управление новостями:</div>
<form method="POST" action="">
Дата новости:
<div><input type="text" name="newsdate"/></div>
Описание новости:
<div><textarea name='newstext' cols='30' rows='15'></textarea></div>
<input type="hidden" name="act" value="do"/>
<input type="submit" name="go" value=" Добавить новость "/>
</form>
}

  • Покритикуйте защиту от reload/back при отправке формы, Ден 24.04.2007 07:39