2008-10-20 2 views
29

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

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

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

+0

Консенсус, конечно же, заключается в том, что это то, что мы все прекрасно программисты (и меня!) Используют :-) Это мощный и надежный метод с преимуществами безопасности в большинстве приложений. – 2008-10-20 16:10:55

+0

Звучит хорошо для меня. :) – 2008-10-20 19:28:15

+0

Это похоже на вопрос How do you prevent a user from posting data multiple times on a website. – Rontologist 2008-10-20 16:17:18

ответ

27

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

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

+1

Как вы обрабатываете пользователя, нажимая кнопку «Назад» (большинство браузеров не запрашиваются повторно), изменяя данные в форме и снова отправляя один и тот же токен? – JeremyWeir 2010-08-19 23:06:37

9

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

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

3

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

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

7

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

-3

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

0

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

Смежные вопросы