2011-01-30 2 views
1

У меня есть этот бит сценария:предотвращение дублирования вставки записи на обновления без перенаправления

if (isset($_POST['comment_posted'])) { 
    $user_comment = mysql_real_escape_string($_POST['user_comment']); 
    $add_user_comment = Event::addUserComment($id,$user->user_id,$user_comment); 
} 

После пользователь отправляет свой комментарий, и обновляет страницу, он будет представлен с «вы собираетесь повторно отправить сообщение данных ". И если пользователь согласится, он будет повторно вставить комментарий пользователя.

Я понимаю, что могу предотвратить это, добавив функцию header и перенаправить элемент на ту же страницу. Можно ли решить эту проблему без перенаправления участника?

ответ

2

Нет. Вы либо сделаете post-redirect-get, либо последующие обновления представит это диалоговое окно пользователю.

В случае, если вы решили не делать PRG, вам нужно как-то обнаружить, что представление дублируется. Один простой способ - ввести скрытый параметр со случайным хеш-номером (например, называется токеном). При представлении вам нужно будет проверить, что маркер, который вы ожидаете (который вы, вероятно, сохранили в сеансе http), отправляется вместе с другими параметрами POST. При действительном представлении вы удалите/аннулируете этот токен. Таким образом, когда POST приходит с не признанным токеном, то, скорее всего, это дубликат или устаревший запрос.

Если вы реализуете это правильно, вы также получите доказательство своего применения к атакам csrf.

0

После успешной отправки вы можете установить переменную сеанса. Для каждого представления вы проверяете, установлена ​​ли переменная или нет, вы вставляете данные.

Смежные вопросы