Предотвращение повторных представлений формы

Я придумал технику, чтобы предотвратить повторную подачу формы, возвращаясь / вперед или обновив страницу. И я подумал о том, чтобы судить об этом здесь, я уже тестировал образец не в производственной среде, какие недостатки вы можете идентифицировать?

Обратите внимание, что мне хорошо известно использование форм-токенов, которые защитят вас от атак CSRF и не будут добавлены в следующие шаги.

-Изменить имя формы для каждой формы и использовать ее как скрытое поле в форме:

$formid = microtime(true)*10000; 

На форму отправить :

  • Проверить данные

  • Вычислить хэш данных полей формы

     $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/

Solutions Collecting From Web of "Предотвращение повторных представлений формы"

Более простой способ добиться того, что вы хотите, это использовать перенаправление на submit. После обработки запроса POST вы перенаправляете, возможно, даже на ту же страницу. Это общий шаблон, называемый «Перенаправление после POST» или POST / Redirect / GET .

Например:

 <?php if($_POST) { // do something // now redirect header("Location: " . $_SERVER["REQUEST_URI"]); exit; } ?> <html> ... <form method="post" action=""> ... </form> 

Установив действие в "", он будет подчиняться самому себе, после чего блок кода if ($ _ POST) будет проверять true и обрабатывать форму, а затем перенаправлять обратно на себя.

Конечно, вы, вероятно, захотите переадресовать на другую страницу, на которой отображается ответ «Ваша форма отправлена» или поместить форму на другую страницу, и HTML-код этой страницы будет ответом.

Преимущество этого метода заключается в том, что когда вы нажимаете кнопку «Назад», он выполняет запрос GET, чтобы форма не была повторно отправлена.

В Firefox он фактически берет представление в себя из истории браузера, поэтому, когда пользователи просматривают веб-страницы, а затем ударяют назад, вместо того, чтобы видеть страницу «спасибо», они видят страницу формы.

Похоже, вы слишком усложняетесь. Мой любимый способ, потому что он также предотвращает некоторые хакеры сессии в одно и то же время, описан здесь:

http://www.spotlesswebdesign.com/blog.php?id=11

Он прост и прост в применении к любой форме. Он использует случайно генерируемый идентификатор экземпляра страницы, чтобы убедиться, что полученная формальная форма идентична последней странице, обслуживаемой этим конкретным пользователем.

Оба вышеупомянутых решения хороши, но немного коротки.

как насчет остановки дальнейших вставок в ближайшие несколько минут от одного и того же пользователя с незначительными изменениями в данных?

это можно сделать, поместив хэш-файл md5 в файл cookie на компьютере пользователя и сохранив копию в базе данных – таким образом, любая дальнейшая попытка с одного и того же компьютера в течение указанного времени может быть проигнорирована и остановлена ​​от вставки в базу данных.

возможно, кто-то может прокомментировать обоснованность и эффективность моего предложения, или я лаяю неправильное дерево ???