голосование - прекращение злоупотреблений со стороны клиента - ASP.NET MVC - PullRequest
3 голосов
/ 14 февраля 2010

поэтому я разработал эту функцию голосования, которая не позволяет кому-либо голосовать за одну и ту же статью дважды за 24 часа. Однако, предположим, что человек голосует, и после того, как он увидел, что ему удалось проголосовать, или что он падает в этом 24-часовом окне, я отключаю кнопку голосования (и это все, кстати, Ajax).

Но что делать, когда человек закрывает свой браузер и возвращается или даже обновляет страницу? Очевидно, что он не сможет голосовать, из-за моего алгоритма, но человек все равно в конечном итоге преуспеет в вызове на сервер. Поэтому, если он действительно хочет, он будет обновлять страницу, нажимать на голосование и загружать ненужную нагрузку на сервер. Как избежать этого, делая что-то на стороне клиента или что-то в этом роде?

Я использую ASP.NET MVC, поэтому переменные сеанса исключены.

Меня это беспокоит?

Ответы [ 4 ]

4 голосов
/ 15 февраля 2010

Если голосование происходит только из зарегистрированных (известных) пользователей, у вас не должно возникнуть проблем.

Если, с другой стороны, каждый может голосовать, вам нужно сохранить все события голосования пользователей:

  • Отметка времени
  • Опрос
  • poll_vote
  • ф
  • пользовательский агент
  • cookie уникальности пользователя

Так что вам понадобится случайный хеш, отправленный в виде cookie. Это гарантирует, что вы не примете другой голос для того же опроса от того же человека.

Если пользователь удаляет свои куки-файлы, вы переходите на план B, где вы не разрешаете более (скажем) 10 голосов с одного и того же IP и комбинации агента пользователя в течение 24 часов.

Система не идеальна, так как пользователи могут менять IP-адреса и (что проще) пользовательских агентов. Вам понадобятся расширенные алгоритмы обнаружения шаблонов для обнаружения подозрительных голосов. Хорошая вещь о хранении всех событий голосования пользователей состоит в том, что вы можете обработать их позже с помощью планировщика или передать голоса другим лицам, которые могут обработать их для вас.

Удачи

1 голос
/ 15 февраля 2010

Обновление не проблема

  1. Если вы проводите все эти голосования с помощью Ajax, обновление страницы ничего не изменит, кроме загрузки страницы с помощью GET.
  2. Если вы не используете Ajax, убедитесь, что вы вызываете результат действия RedirectToAction / RedirectToRoute, что также поможет вам избежать проблем с обновлением.

Как вы узнаете пользователей

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

печенье

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

Комбинация

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

0 голосов
/ 15 февраля 2010

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

Если вы все еще хотели установить 24-часовой лимит, тогда вам нужно сохранить Dictionary<articleId,DateTime>, тогда вы можете проверить, голосовал ли он уже за эту статью и имел ли он, когда она была.

0 голосов
/ 14 февраля 2010

Лучшим способом было бы отследить, кто за что проголосовал и за что на сервере (возможно, хранит его в базе данных). Чтобы сделать это, вы должны использовать систему аутентификации на вашем сайте (вероятно, форма аутентификации ) для идентификации пользователей. Поэтому каждый раз, когда кто-то пытается проголосовать, вы сначала проверяете в своем хранилище данных, проголосовал ли он и когда, и решаете, подтверждать ли голос или нет. Это самый надежный способ.

Если ваш сайт является анонимным (для голосования не требуется аутентификация), вы можете сохранить постоянный файл cookie на клиентском компьютере, который будет храниться в течение 24 часов и сообщать, что с этого компьютера уже было подано голосование. Помните, что куки могут быть отключены, удалены и не являются надежным способом идентификации данного пользователя.

Я использую ASP.NET MVC, поэтому сессия переменные не обсуждаются.

Есть причина для этого? Сессии прекрасно работают в приложениях ASP.NET MVC. В вашем случае они не будут работать, потому что если пользователь закроет браузер, он потеряет сеанс.

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

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

...