Подтвердить что ты не робот

Предотвращение двойного HTTP POST

Я сделал небольшое приложение для регистрации на мероприятие. Пользователь вводит свои данные и нажимает "Подписать меня".

Теперь иногда люди имеют двойную базу данных, те же самые данные, которые были вставлены 2 раза очень быстро после друг друга. Это может означать, что кто-то дважды нажал кнопку, что вызвало две записи.

Это обычная проблема в сети, поскольку приложения для кредитных карт и форумы часто говорят: "Щелчок один раз достаточно!".

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

Это, конечно же, не относится к веб-формам ASP.NET, потому что POST не имеет значения.

4b9b3361

Ответ 1

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

Если страница, где отображается форма, динамически генерируется, вы можете добавить скрытое поле, которое содержит какой-то порядковый номер, хеш или что-то уникальное. Затем у вас есть проверка на стороне сервера, которая будет проверять, пришел ли запрос с этим уникальным значением. Когда пользователь отправляет форму, уникальное значение проверяется на список "используемых" значений. Если он существует в списке, это запрос об ошибке и может быть отброшен. Если он не существует, добавьте его в список и обработайте как обычно. Пока вы убедитесь, что значение уникально, это гарантирует, что одна и та же форма не может быть отправлена ​​дважды.

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

Ответ 2

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

Ответ 3

Пользовательское решение - отключить кнопку отправки через Javascript после первого щелчка.

У этого есть недостатки, но я вижу, что он часто используется на сайтах электронной коммерции.

Но он никогда не заменит действительную проверку на стороне сервера.

Ответ 4

Методы клиентской стороны полезны, но вы можете связать их с некоторыми методами на стороне сервера.

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

В вашем случае, если у вас есть таблица с посетителями событий, вы можете включить этот токен в качестве столбца.

Ответ 5

Клиент-единственное решение будет недостаточным, как указано во многих ответах здесь. Вам необходимо выполнить отказоустойчивость на стороне сервера.

Часто упускается из виду, что отключение кнопки отправки не работает, пользователь может просто обновить цель отправки (и нажать "ОК" в "вы уверены, что хотите повторно отправить данные POST-данных?" ). Или даже некоторые браузеры могут неявно перезагружать отправленную страницу при попытке сохранить страницу на диск (например, вы пытаетесь сохранить бумажную копию подтверждения заказа).

Ответ 6

Всякий раз, когда запрашивается страница с сервера, создайте уникальный requestToken, сохраните его на стороне сервера, отметьте статус как НЕ обработанный и передайте его вместе с текущей запрашиваемой страницей. Теперь всякий раз, когда происходит отправка страницы, получайте requestToken из данных "POST" и проверяйте состояние и сохраняйте данные или выполняйте альтернативные действия.

В большинстве банковских приложений этот метод используется для предотвращения двойного "POST". Это проверенный временем и надежный способ предотвращения двойных представлений.

Ответ 7

Ни одно из решений не предназначено для сервера балансировки нагрузки.

Если у вас есть какой-то балансировщик нагрузки, отправка UUID (или любого другого уникального номера) на сервер для сохранения и повторного чтения не будет работать хорошо, если сервер не знает о других серверах, поскольку каждый запрос может обрабатываться другим сервером. в среде без гражданства. Эти серверы должны читать/писать в одном и том же месте.

Если у вас есть несколько серверов, вам понадобится общий кеш (например, Redis) для серверов, чтобы считывать/записывать уникальные значения в одном месте (что может быть слишком сложным решением, но работает).

Ответ 8

Почти никто не отключил js. Подумайте о кодировании вашего сайта электронной коммерции для 70-летней женщины, которая дважды щелкает по каждой ссылке и кнопке. Все, что вы хотите сделать, это добавить javascript, чтобы не нажимать дважды кнопку "Заказать сейчас". Да - проверьте это на стороне сервера слишком "защищаться", но не делайте код для этого случая. Но ради лучшего пользовательского интерфейса сделайте это и на стороне клиента.

Вот некоторые скрипты, которые я нашел:

//
// prevent double-click on submit
//
  jQuery('input[type=submit]').click(function(){
    if(jQuery.data(this, 'clicked')){
      return false;
    }
    else{
      jQuery.data(this, 'clicked', true);
      return true;
    }
  });

и

// Find ALL <form> tags on your page
$('form').submit(function(){
    // On submit disable its submit button
    $('input[type=submit]', this).attr('disabled', 'disabled');
});

Ответ 9

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

  • Отключить кнопку отправки
  • Измените экран на экране "Подождите"
  • Если форма была модальной, изменение экрана обратно на обычный процесс (это имеет смысл сделать вещи выглядят действительно гладкими). ​​

Но это не идеально. Все зависит от доступности JS, и если это не так, без обнаружения дублирования дублирования, вы получите дубликаты.

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

Ответ 10

Вы можете отслеживать количество отправленных форм и сравнивать их с количеством уникальных посещений страницы с формой на ней в сеансе.

Ответ 11

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