Как обрабатывать несколько запросов на стороне сервера
Мы все знаем, что старый добрый "отключить кнопку отправки", но каковы наилучшие способы обработки нескольких сторон сервера отчетов? У меня есть приложение, где абсолютно важно, чтобы форму отправляли только один раз - она обрабатывает кредитную карту. Я не писал, как это происходит прямо сейчас, но в качестве быстрого исправления я бросил метод disable-on-submit, однако некоторые нетерпеливые пользователи, у которых отключен javascript, все еще получают два заряда.
Итак, каковы способы избежать этого? Я могу подумать о нескольких - я использовал несколько в прошлом, но я хотел бы посмотреть, есть ли какие-либо "лучшие практики" в том, как справиться с этим. Я использую PHP, но меня больше интересуют понятия.
edit:. Я знаю технику маркера и это то, что я использовал в прошлом, этот вопрос более или менее, чтобы увидеть, соответствует ли мой подход тому, что остальное из вас тонкие программисты используют.
Ответы
Ответ 1
Один действительно эффективный способ - отправить маркер вместе с запросом и сохранить список используемых токенов. Если токен недействителен или токен уже обработан, то отмените.
Токен может быть таким же простым, как добавочное целое число, сохраненное в скрытом текстовом поле, или вы можете зашифровать его для повышения безопасности. Эта функция может быть более надежной, генерируя токен при создании страницы, шифруя ее, а затем подтверждая, что токен был сгенерирован И не был обработан.
Ответ 2
Включить случайный уникальный токен в поле скрытой формы. Затем на бэкэнд вы можете проверить, было ли оно отправлено раньше.
Это, как правило, хорошая идея, потому что она помогает вам защищаться от атак XSS.
Ответ 3
Вы также можете просто проверить, была ли сделана идентичная транзакция в последнюю минуту (или вторая, в зависимости от латентности вашего сервера). Большинство людей не покупают две одинаковые книги (или что-то еще) в течение минуты друг от друга, используя одну и ту же карточку. Если вы сохраняете кэш платежей по кредитным картам в последнюю минуту и проверяете, совпадает ли тот, который вы собираетесь сделать, идентичный (тот же номер карты, то же количество), который вы только что сделали, скорее всего, вы обнаружите дубликат.
Ответ 4
Я бы не стал полагаться на какую-либо клиентскую сторону для этого. Почему бы не создать уникальный идентификатор для этой транзакции на стороне сервера, прежде чем представить клиенту кнопку отправки? Затем клиент должен отправить этот токен обратно, и вы проверяете серверную сторону, что каждый токен отправляется один раз.
Маркер может, как говорят другие люди, быть инкрементирующим целым числом (+ имя пользователя) или GUID.
Ответ 5
У меня такая же проблема. Прочитав это, я думаю, что токен может быть способом. Этот пост показывает хороший пример реализации.
Ответ 6
Не нужно создавать уникальные токены и весь этот джаз. После прохождения проверки формы просто перенаправьте посетителя на другую страницу, в которой говорится что-то вроде "Ваша кредитная карта обрабатывается". Если посетитель перезагружает страницу, они перезагружают перенаправленную страницу, а не отправку POST.