Как обрабатывать несколько представлений на стороне сервера - PullRequest
31 голосов
/ 20 октября 2008

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

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

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

Ответы [ 6 ]

29 голосов
/ 20 октября 2008

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

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

10 голосов
/ 20 октября 2008

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

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

8 голосов
/ 20 октября 2008

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

3 голосов
/ 20 октября 2008

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

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

0 голосов
/ 02 апреля 2014

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

0 голосов
/ 07 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...