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

Страница одна содержит HTML-форму. Страница вторая - код, обрабатывающий представленные данные.

Представлена ​​форма на первой странице. Браузер перенаправляется на страницу два. Страница 2 обрабатывает представленные данные.

В этот момент, если страница 2 обновляется, появляется сообщение "Подтвердить повторное заполнение формы".

Можно ли это предотвратить?

Ответ 1

Есть два подхода, которые люди использовали здесь:

Способ 1: Использовать AJAX + Перенаправление

Таким образом, вы отправляете свою форму в фоновом режиме с помощью JQuery или что-то похожее на страницу 2, пока пользователь все еще видит страницу1. При успешной публикации вы перенаправляете браузер на страницу.

Способ 2: Опубликовать + Перенаправить на себя

Это обычная техника на форумах. Form на странице 1 отправляет данные на страницу2, Page2 обрабатывает данные и делает то, что нужно сделать, а затем перенаправляет HTTP на себя. Таким образом, последнее "действие", которое помнит браузер, является простым GET на стр. 2, поэтому форма не будет повторно отправлена ​​после F5.

Ответ 2

Вам нужно использовать шаблон PRG - Post/Redirect/Get, и вы только что реализовали P из PRG. Вам нужно перенаправить. (Теперь дни вам вообще не нужно перенаправление. Смотрите это)

PRG - это шаблон дизайна веб-разработки, который предотвращает дублирование некоторых форм, что означает "Отправить форму" (Post Request 1) → Redirect → Get (Request 2)

Under the hood

Код состояния перенаправления - HTTP 1.0 с HTTP 302 или HTTP 1.1 с HTTP 303

Ответ HTTP с кодом состояния перенаправления дополнительно предоставит URL в поле заголовка местоположения. Пользовательский агент (например, веб-браузер) приглашается в ответ с этим кодом, чтобы сделать второй, в остальном идентичный, запрос на новый URL-адрес, указанный в поле местоположения.

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

Double Submit Problem

Double Submit Problem

Post/Redirect/Get Solution

Post/Redirect/Get Solution

Источник

Ответ 3

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

Предотвратить кнопку "Назад" , чтобы показать подтверждение подтверждения POST

Двумя основными обходными решениями были шаблон PRG, и AJAX submit, за которым следует переключение сценариев.

Обратите внимание, что если ваш метод допускает метод GET, а не метод отправки POST, тогда это будет решать проблему и лучше вписываться в соглашение. Эти решения предоставляются в предположении, что вы хотите/нуждаетесь в данных POST.

Ответ 4

Единственный способ быть на 100% уверенным, что одна и та же форма никогда не представляется дважды, заключается в том, чтобы внедрить уникальный идентификатор в каждый из выпущенных вами и отслеживать, какие из них были отправлены на сервере. Ловушка заключается в том, что если пользователь обращается к странице, на которой была форма, и вводит новые данные, такая же форма не будет работать.

Ответ 5

В ответе есть две части:

  • Убедитесь, что дубликаты сообщений не связаны с вашими данными на стороне сервера. Для этого вставьте уникальный уникальный идентификатор в сообщение, чтобы вы могли отказаться от последующих запросов на стороне сервера. Этот шаблон называется Idempotent Receiver в терминах обмена сообщениями.

  • Убедитесь, что пользователь не обеспокоен возможностью дублирования отправки с помощью

    • перенаправление на GET после POST (POST перенаправление шаблона GET)
    • отключение кнопки с помощью javascript

Ничто из того, что вы делаете в разделе 2., полностью предотвратит дублирование отправки. Люди могут щелкнуть очень быстро, и хакеры могут публиковать в любом случае. Вам всегда нужно 1. Если вы хотите быть абсолютно уверены, что дубликатов нет.

Ответ 6

Если вы обновите страницу с данными POST, браузер подтвердит вашу повторную отправку. Если вы используете данные GET, сообщение не будет отображаться. Вы также можете иметь вторую страницу после сохранения отправки, перенаправить на третью страницу без каких-либо данных.

Ответ 7

Ну, я не нашел, чтобы никто не упоминал этот трюк.

Без перенаправления вы все равно можете предотвратить подтверждение формы при обновлении.

По умолчанию код формы выглядит следующим образом:

<form method="post" action="test.php">

теперь измените его на <form method="post" action="test.php?nonsense=1">

Вы увидите волшебство.

Я предполагаю, потому что браузеры не будут вызывать всплывающее окно подтверждения, если он получит метод GET (строку запроса) в URL-адресе.

Ответ 8

Шаблон PRG может только предотвратить повторную подачу, вызванную обновлением страницы. Это не 100% безопасная мера.

Обычно для предотвращения повторной отправки я буду принимать действия ниже:

  • Сторона клиента - используйте javascript, чтобы предотвратить дублирование кликов на кнопке, которая приведет к отправке формы. Вы можете просто отключить кнопку после первого щелчка.

  • Серверная сторона - я буду вычислять хэш на представленных параметрах и сохранять этот хэш в сеансе или базе данных, поэтому, когда получен дублированный прием, мы можем обнаружить дублирование, а затем правильный ответ клиенту. Однако вы можете создать хэш на стороне клиента.

В большинстве случаев эти меры могут помочь предотвратить повторную отправку.

Ответ 9

Мне очень нравится @Энджелин. Но если вы имеете дело с каким-то устаревшим кодом, где это не практично, этот метод может сработать для вас.

В верхней части файла

// Protect against resubmits
if (empty($_POST))  {
   $_POST['last_pos_sub'] = time();
} else {
     if (isset($_POST['last_pos_sub'])){
        if ($_POST['last_pos_sub'] == $_SESSION['curr_pos_sub']) {
           redirect back to the file so POST data is not preserved
        }
        $_SESSION['curr_pos_sub'] = $_POST['last_pos_sub'];
     }
}

Затем в конце формы вставьте last_pos_sub следующим образом:

<input type="hidden" name="last_pos_sub" value=<?php echo $_POST['last_pos_sub']; ?>>

Ответ 10

Попробуйте tris:

function prevent_multi_submit($excl = "validator") {
    $string = "";
    foreach ($_POST as $key => $val) {
    // this test is to exclude a single variable, f.e. a captcha value
    if ($key != $excl) {
        $string .= $key . $val;
    }
    }
    if (isset($_SESSION['last'])) {
    if ($_SESSION['last'] === md5($string)) {
        return false;
    } else {
        $_SESSION['last'] = md5($string);
        return true;
    }
    } else {
    $_SESSION['last'] = md5($string);
    return true;
    }
}

Как использовать/пример:

if (isset($_POST)) {
    if ($_POST['field'] != "") { // place here the form validation and other controls
    if (prevent_multi_submit()) { // use the function before you call the database or etc
        mysql_query("INSERT INTO table..."); // or send a mail like...
        mail($mailto, $sub, $body); // etc
    } else {
        echo "The form is already processed";
    }
    } else {
    // your error about invalid fields
    }
}

Шрифт: https://www.tutdepot.com/prevent-multiple-form-submission/

Ответ 11

используйте js для предотвращения добавления данных:

if ( window.history.replaceState ) {
    window.history.replaceState( null, null, window.location.href );
}

Ответ 12

Вы можете сделать это с помощью jquery

<script>
   $(document).ready(function(){
   window.history.replaceState('','',window.location.href)
   });
</script>

Это самый элегантный способ предотвратить повторную передачу данных после отправки обратно.

Надеюсь это поможет.

Ответ 13

Я использую Chrome, и вы можете это сделать...

1) вы можете использовать это на странице, которую отправляет форма:

<?php
    if(isset($_POST['yourpost'])){
        //your codes go here
        //in the end of this lines you will do this:
        header("Location: this same page.php");
        exit;
    }
    else{
        //do nothing
    }
?>

КОД ВАШЕГО HTML НИЖЕ

<html>....</html>