Я придумал технику для предотвращения повторной подачи формы, возвращая/переместив или обновив страницу. И я подумал о том, чтобы судить об этом здесь, я уже тестировал образец не в производственной среде, какие недостатки вы можете идентифицировать?
Обратите внимание, что мне хорошо известно использование форм-токенов, которые защитят вас от атак CSRF и не будут добавлены в следующие шаги.
-Создать идентификатор формы для каждой формы и использовать его как скрытое поле в форме:
$formid = microtime(true)*10000;
- В форме submit:
-
Подтвердить данные
-
Вычислить хэш данных полей формы
$allvals = ''; foreach($_POST as $k=>$v){ $allvals .= $v; } $formHash = sha1($allvals);
-
Проверять хэш хэшей, сравнивая с ранее сохраненными хэшами. значение сеанса привязывается к каждой форме переменной $formid.
$allowAction = true; if(isset($_SESSION['formHash'][$_POST['formid']]) && ($_SESSION['formHash'][$_POST['formid']] == $formHash)){ $allowAction = false; }
- Если хэш не был найден, это означает, что это первая форма, представленная или данные формы изменены.
-
Если данные сохранены (например, в базе данных), сохраните хэш формы в сеансе:
$_SESSION['formHash'][$_POST['formid']] = $formHash;
Полная версия кода: http://thebusy.me/2011/01/06/preventing-duplicate-form-submissions/