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

Как обрабатывать несколько запросов на стороне сервера

Мы все знаем, что старый добрый "отключить кнопку отправки", но каковы наилучшие способы обработки нескольких сторон сервера отчетов? У меня есть приложение, где абсолютно важно, чтобы форму отправляли только один раз - она ​​обрабатывает кредитную карту. Я не писал, как это происходит прямо сейчас, но в качестве быстрого исправления я бросил метод disable-on-submit, однако некоторые нетерпеливые пользователи, у которых отключен javascript, все еще получают два заряда.

Итак, каковы способы избежать этого? Я могу подумать о нескольких - я использовал несколько в прошлом, но я хотел бы посмотреть, есть ли какие-либо "лучшие практики" в том, как справиться с этим. Я использую PHP, но меня больше интересуют понятия.

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

4b9b3361

Ответ 1

Один действительно эффективный способ - отправить маркер вместе с запросом и сохранить список используемых токенов. Если токен недействителен или токен уже обработан, то отмените.

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

Ответ 2

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

Это, как правило, хорошая идея, потому что она помогает вам защищаться от атак XSS.

Ответ 3

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

Ответ 4

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

Маркер может, как говорят другие люди, быть инкрементирующим целым числом (+ имя пользователя) или GUID.

Ответ 5

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

Ответ 6

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