Запретить пользователям голосовать несколько раз на веб-сайте

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

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

Файлы cookie могут быть ответом, но опытный пользователь может удалить файл cookie. Есть идеи получше?


person Doogal    schedule 21.02.2009    source источник


Ответы (16)


Извините, у меня нет полезного ответа, я просто хочу поделиться своим опытом.

Около 8 лет назад я работал на сайте, который проводил онлайн-опросы. Однажды нас взломали какие-то боты, голосующие по некоторым нашим вопросам несколько сотен голосов в минуту.

Пришлось внедрить кое-какие экстренные проверки: IP-адрес, куки и уж точно не помню что еще.

В конце дня мы решили снять опросы. Этим чертовым роботам было все равно. IP-адреса подделывались, файлы cookie удалялись и т. д.

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

И самое печальное, что это был просто развлекательный сайт с опросами о том, какой твой любимый цвет и тому подобное.

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

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

person Sergio Acosta    schedule 21.02.2009
comment
Вы не можете подделать IP-адрес? - person Sam152; 21.02.2009
comment
При особых обстоятельствах да, можно. Кроме того, есть проксирование и другие способы изменения вашего IP, а также ботнеты, взлом маршрутизаторов и многое другое. IP-адреса по-прежнему хороши для многих целей, но Форт-Нокс — нет. - person Jens Roland; 21.02.2009
comment
Я не эксперт в TCP/IP, но я полагаю, что вы должны быть в состоянии легко подделать IP-адрес на уровне пакета, если все, что вам нужно, это сделать запрос (например, в DoS-атаке), и вы не ожидаете, что вернуть ответ. Но я знаю, что могу ошибаться. - person Sergio Acosta; 23.02.2009
comment
@Sergio: это не совсем тривиально для TCP / IP, поскольку даже простой HTTP-запрос требует рукопожатия с сервером, что довольно сложно сделать правильно, если вы не слышите ответ серверов. - person Joachim Sauer; 07.09.2009

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

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

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

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

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

person LeopardSkinPillBoxHat    schedule 21.02.2009
comment
MAC-адреса не отображаются в заголовках http. Следовательно, веб-сайт не может их использовать - person DanSingerman; 21.02.2009
comment
@HermanD - Да, это было глупое предложение, когда я об этом подумал. Может быть, другое уникальное поле в сегменте TCP или заголовке IP? Единственная проблема заключается в том, что TCP-соединение будет сбрасываться каждый раз, поэтому это также невозможно. - person LeopardSkinPillBoxHat; 21.02.2009
comment
@LeopardSkinPillBoxHat: кроме того, без глубокого взлома веб-сервера вы не получите данные TCP из своего HTTP-приложения (и это хорошо, в большинстве случаев) - person Piskvor left the building; 10.06.2009

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

Теперь, когда люди могут войти в систему с любого компьютера, идентификация компьютера не поможет. Это исключает проверки IP и файлы cookie, а также все остальное, зависящее от аппаратного обеспечения пользователя.

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

Даже регистрация пользователя не очень помогает сама по себе — они могут просто зарегистрировать другую учетную запись.

person Svante    schedule 21.02.2009
comment
да, но они, скорее всего, не зарегистрируют тонны учетных записей только для подделки нескольких голосов :) - person Gigala; 29.04.2013

Интересно, не могли бы вы сделать это многоэтапным процессом, чтобы сделать его более сложным для ботов.

Регистрация или другая подобная задача дают вам Cookie-A, а затем, когда вы голосуете, вы получаете Cookie-B, но если у вас есть Cookie-B и нет подходящего соответствующего Cookie-A, ваш голос не засчитывается. Если вы попытаетесь повторно зарегистрироваться на том же компьютере, это может быть обнаружено тем, что у вас уже есть Cookie-A. Слишком быстрое выполнение шагов рассматривается как BOT.

У нас был психометрический тест, в котором было много вопросов, и пользователи должны были дать вдумчивые ответы. Ответом менее чем за N секунд было то, что кто-то просто нажимал кнопки, чтобы пройти через него. Мы никогда не говорили им, что их ответ был слишком быстрым, мы просто помечали данные как «подозрительные».

Так что любой, кто попытается перейти прямо к кнопке голосования, не сработает. Им нужно будет выполнить Шаг-А, затем Шаг-В, затем Шаг-С по порядку.

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

Требование включения JavaScript может помочь, как и система Captcha. Captcha может иметь некоторую задержку — «Пожалуйста, посмотрите, как появляются два слова», чтобы были два слова, показанные одно за другим, но «настоящие слова», чтобы их можно было легко запомнить, а затем ввести. Любой ответ, который «слишком быстро» недействительно.

В какой-то момент люди просто раздражаются и не беспокоятся.

person Kristen    schedule 21.02.2009

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

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

Джефф Этвуд написал статью о "барьере входа", которая может дать вам подсказки.

person MarmouCorp    schedule 14.03.2009

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

Это не сработало. Люди создали сотни ложных адресов электронной почты на различных бесплатных сайтах.

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

Конечно, это все еще легко обойти для кого-то достаточно мотивированного, но в данном случае это, похоже, сработало.

person Jonathan Patt    schedule 07.09.2009

Я никогда не использовал подобную систему, но пытаюсь идентифицировать пользователя по отпечатку пальца его браузера. Этот плагин jQuery объединяет размер экрана, глубину цвета, часовой пояс пользователя и установленные плагины для создания уникальный идентификатор пользователя. Определенно не надежный, но это другой подход.

person Jason Barry    schedule 28.09.2011

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

person TFM    schedule 21.02.2009

Я думаю, вы должны зарегистрировать пользователя, прежде чем он проголосует за / против. Вы можете получить немного информации от пользователя, чтобы зарегистрироваться, чтобы он не скучал и не ломал свою регистрацию. После этого он может обновить свою учетную запись, если захочет. ИМХО это лучшее решение.

person Canavar    schedule 21.02.2009

Как уже было сказано, «идеального» решения не существует.

Как попытка несовершенного решения, как насчет хранения хэша IP-адреса и пользовательского агента.

Это будет означать, что разные пользователи с данного IP-адреса, у которых есть разные пользовательские агенты браузера, по-прежнему могут голосовать.

person DanSingerman    schedule 21.02.2009

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

person cdonner    schedule 21.02.2009
comment
А что насчет тех, кто использует файлы cookie, заблокированные по умолчанию? - person random; 14.03.2009

Также возможность:

пусть пользователь проголосует и заполнит свой адрес электронной почты. Пользователь получает подтверждение по электронной почте со ссылкой, по которой ему нужно щелкнуть, чтобы подтвердить свой голос.

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

Или сделайте это в сочетании с зарегистрированными пользователями (которые не будут вынуждены подтверждать)

person Natrium    schedule 24.02.2009

Я знаю, что это старая тема. В любом случае я предлагаю использовать evercookie (http://samy.pl/evercookie/) для отслеживания пользователя которые уже проголосовали!

person Davide Scicolone    schedule 14.10.2015

Вопрос в том, сколько личностей может контролировать один человек. Чем сложнее одному человеку контролировать несколько личностей, тем безопаснее будет ваш опрос.

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

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

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

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

person Calmarius    schedule 06.01.2016

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

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


Если вам нужно сделать это самостоятельно.

Как уже было сказано, регистрация — единственный верный способ. Если действительно важно избежать дублирования голосов (т.е. это не просто любимый цвет или что-то тривиальное/забавное), вы также можете ограничить голосование ссылкой, которую вы отправляете на электронную почту, которую они зарегистрировали.

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

person James    schedule 01.03.2020

Вы уже назвали все пригодные решения. ;) Теперь решать вам.

Я бы рекомендовал совместить проверку IP и файлов cookie.

person Lennart Koopmann    schedule 21.02.2009
comment
Файлы cookie находятся под контролем клиента, поэтому их легко предотвратить. Не рекомендуется ИМО. - person Treb; 21.02.2009