Подтвердить что ты не робот

Как вы препятствуете пользователю несколько раз отправлять данные на веб-сайте

Я работаю над веб-приложением (J2EE), и мне бы хотелось узнать параметры, доступные для обработки двойной почты из браузера.

Решения, которые я видел и использовали в прошлом, все клиентские:

  • Отключите кнопку отправки, как только пользователь нажмет на нее.
  • Следуйте шаблону POST-Redirect-GET, чтобы предотвратить POST, когда пользователь нажимает кнопку "Назад".
  • Обрабатывать событие onSubmit формы и отслеживать состояние отправки с помощью JavaScript.

Я предпочел бы, если возможно, реализовать решение на стороне сервера. Есть ли какие-либо более эффективные подходы, чем те, которые я упомянул выше, или лучшие решения на стороне клиента?

4b9b3361

Ответ 1

Его трудно реализовать идиот-защищенное решение (поскольку они всегда улучшают идиотов). Независимо от того, что вы делаете, клиентскую сторону можно манипулировать или выполнять неправильно.

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

Ответ 2

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

Ответ 3

Приходят на ум два серверных решения:

  • Создайте одноразовые "токены" в скрытом поле формы. Когда используется токен, он удаляется из любого объекта контекста базы данных или сеанса, в котором вы его храните. Второй раз это не принимается.
  • Полученная информация о кеше, и если идентичная форма получена в течение определенного периода времени (10 минут? час? Вы решаете!), она игнорируется.

Ответ 4

Внедрите uniqueid, чтобы пойти с запросом и зарегистрировать его вместе с исполнением. Если идентификатор уже зарегистрирован, вы снова не выполняете эту работу. Это похоже на резервное решение - вы должны попробовать отключить кнопку или ссылку клиентов, а также предложили себе

Ответ 5

мы используем одноразовый билет времени. Это похоже на идентификатор сеанса. Но он привязан к форме/странице.

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

Ответ 7

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