Токен-метод на бланках, двойной запрос на отправку - PullRequest
1 голос
/ 23 июля 2010

Я провел недели, работая над двойной защитой в моих формах. Кстати, сессионный метод хранения токенов не работает.

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

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

Есть ли другой способ предотвращения этой проблемы на стороне сервера?

1 Ответ

3 голосов
/ 23 июля 2010

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

  • Сохранение токена в базе данных с полями (tokencode, Applicid).
  • Вкл.получая, установите для претендента значение microtime(), возможно, даже для идентификатора процесса или хэша, поскольку гарантируется уникальность в аналогичных процессах, запущенных в одно мгновение друг от друга.
  • Попробуйте запроситьтокен: UPDATE tokens SET claimid = <id> WHERE tokencode=tokencode AND claimid IS NULL
  • Количество строк, измененных предыдущим оператором (или выбор).
  • Если строка изменилась и / или имеет ваш microtime (), то вы заявите: вы -победитель, продолжите действие
  • Если ничего не изменилось или токен неверен, если действие не будет выполнено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...