
Рассмотрим пример защиты от дублирования отправки данных посредством формы.
Для чего это нужно?
Возникает ситуация когда пользователь заполняет форму и нажимает кнопку «Отправить». Отправляемые данные записываются в базу (к примеру). Пользователю приходит некоторая страница об успешной отправке данных. После чего пользователь случайно или намерено жмет на кнопку F5 (обновить), предыдущий запрос с уже когда-то заполненными данными снова отправляется на сервер. Таким образом, заполненные ранее данные в форме отправляется заново, что не очень хорошо.
В данном примере задача решается с использованием cookies и md5 хэша данных.
Итак, код:
<?php
// В случае наличия POST переменных
if(count($_POST)){
// формируем строку из данных формы
$long = "";
while(list($key,$value)=each($_POST))
$long .= $value;
// получаем хэш строки
$hash = md5($long);
// отправляем кукисы с хэшем в браузер
setcookie("lasthash",$hash,time()+60*60*24*30);
} else
$hash = 'none';
// если принятые значения lasthash не совпадают с текущим хэшом
if ( $_COOKIE["lasthash"] != $hash ){
// показываем форму, либо сообщение
if (!isset($_POST['send']))
echo '<form method="post">
<input type="text" name="inp">
<input type="submit" name="send">
</form>';
else
echo 'Форма отправлена!';
} else { // иначе если lasthash идентичен
echo 'Дублирование данных!';
}
?>
Внимание
Стоит заметить, что при работе с cookies имеется значимый недостаток – они могут быть выключены в браузере. После чего, выше описанный код не поможет решить проблему дублирования данных.
Как вариант решения проблемы: можно проверять включены ли cookies в браузере, либо вовсе не использовать cookies для этих целей.
Так же, можно производить редирект (с помощью заголовков header()) при первой же отправке формы. Несомненно существуют и другие методы защиты от дублирования данных, пожалуй мы ещё вернемся к этой теме в другой статье.