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