Метод токена в формах, двойная отправка вопроса

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

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

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

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

Solutions Collecting From Web of "Метод токена в формах, двойная отправка вопроса"

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

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