Как вы можете запретить пользователю размещать данные несколько раз на веб-сайте

StackOverflow https://stackoverflow.com/questions/130337

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

мы используем одноразовый билет, учитывающий время.Это что-то вроде идентификатора сеанса.Но это привязано к форме / странице.

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

В Struts встроено что-то подобное, если вы случайно им пользуетесь.

http://struts.apache.org/1.x/apidocs/org/apache/struts/util/TokenProcessor.html

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top