Информационная безопасность

индекс
289,89

Интернет голосования, концепт защиты от накруток

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

Итак, вам понадобилось провести интернет-голосование «Мисс Карбина-телеком, Нижний Укропольск — 2012». Первое, с чем вы наверняка столкнетесь — это накрутки со стороны конкурсантов, если кого-то вы действительно смогли заинтересовать своим конкурсом, а если быть совсем уж честными, то его призами.

Для начала нужно правильно сформулировать цель защиты — «сделать максимально жесткую привязку голоса в счетчике к реальному человеку».

Самое красивое и технически на данный момент сложно обходимое решение — это привязка голоса к сотовому телефону. Так мы сразу записываемся в клуб по интересам с Vkontakte и «Одноклассниками», вызываем у пользователей приступ паранойи и при этом делаем все дорого и изящно. Еще можно и денежек немного подзаработать, если сделать голосование платным. ;) Но мы ведь хорошие парни, это не для нас.

Только вот не всем нравится слово «дорого». Ну, что ж есть и другие варианты решения проблемы. Кому интересно — welcome под кат.



Сразу скажу, что все остальные технические средства защиты не дают 100% гарантии защиты и реально обходимы. Единственное, что можно сделать – это максимально усложнить жизнь потенциальным накручивальщикам.

Способ № 1: привязка голоса к ip-адресу.


Преимущества:

+ С одного ip адреса больше одного раза действительно не проголосуешь.

Недостатки:

— Картинку сильно портят различные виды proxy и Nat. Причем второй точно отсечет от участия в голосовании какую-то часть легальных пользователей. Скорей всего вам этого не нужно.

Способ № 2: сбор статистики по пришедшим заголовкам запроса.


Преимущества:

+ Если бот не меняет значение User-Agent или у него всего несколько вариантов, то участник голосования уже под подозрением. Если даже вариантов достаточно много, то можно построить гистограмму и посмотреть получившееся распределение. Меня, например, очень смутит доля Google.Chrome в 80% у отдельно взятого Василия Пупкина. Еще можно сравнить гистограмму со средней по сайту или с гистограммами других участников, чтобы учесть особенности аудитории сайта.

+ Особенно нужно следить за заголовком Referer. Iframe вставленный на сторонний, посещаемый вебресурс мигом может поднять чей-нибудь рейтинг до небес. Это очень дешевое и сердитое решение, правда и фиксится легко. Лучше всего жестко ограничить Referer страницей с формой отправки голоса.

+ Еще советую обратить внимание на значения заголовков Accept-Encoding (у браузеров обычно тут стоит gzip) и Connection (тут нас должно ждать keep-alive). Боты часто ленятся реализовать их.

Недостатки:

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

Способ № 3: дублирующий счетчик посещаемости (и подсчета голосов) на client-side.


Преимущества:

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

+ Можно подсчитать посещаемость страницы с формой даже не встраивая самому счетчик на js или flash, а воспользоваться готовым Google.Analytics. Если проголосовавших 2000, а количество хостов ~ 200, то это уже наводит на мысли.

Недостатки:

— Человек с головой быстро сообразит, что большинство client-side счетчиков работает на пресловутом http. Остается натравить сниффер на веб-страничку и посмотреть кто, куда и зачем ходит, даже не придется лезть в код самой страницы. Кстати, тут злобные хацкеры могут забыть про задержку выполнения js, связанную с рендерингом и выполнением самого js, да и сам порядок запросов. Вот на этом можно поймать.

Способ № 4: Добавить в скрытое поле формы рендомный id, проверяемый при отправке. Также запоминать ip-адрес в еще одно скрытое поле этой же формы. Плюс смотреть наличие и значение сессии, и метить посетителя куками, сохраняя в БД связку печенька-ip.


Преимущества:

+ Злоумышленнику необходимо выполнить минимум два запроса и не забыть посмотреть скрытые поля формы.

+ Очень многие socks сервера дают новый ip адрес на каждое socket-соединение. Если нужно сделать два запроса (на страничку с формой и на отправку этой формы), то могут возникнуть проблемы.

Недостатки:

— Существует механизм keep-alive, который по идее позволяет сделать несколько запросов через одно socket-соединение. Врать не хочу, сам плотно с этой темой не работал.

— Случайный номер, печенька и сессия легко обходятся.

Способ № 5: Следить за контентом, который запрашивает посетитель при загрузке странички.


Преимущества:

+ Бота обычно интересует только html странички, а css, js и картинки он может напрочь игнорировать.

Недостатки:

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

Способ № 6: посмотреть, что за ip к вам пришел.


Преимущества:

+ Ip адрес, выданный прокси иногда можно разрешить во что-то любопытное. Например, можно получить доменное имя, явно указывающее на принадлежность к proxy-братству. Либо если кто-то решил использовать Tor, скорей всего вы сможете полюбоваться на домен одного из известных университетов.

+ Часто голосование можно географически локализовать и посмотреть соответствует ли ip-адрес нужному региону. Не правда ли странно, что на вашем конкурсе «Мисс Карбина-телеком, Нижний Укропольск — 2012» появились голоса из Мексики? ;)

Недостатки:

— Хацкер может купить proxy соответствующей географической области, причем полностью анонимные, но это дорогое удовольствие.

В сухом остатке.


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

p.s. Статья не претендует на истину в последней инстанции. Желающие что-то добавить или конструктивно покритиковать — добро пожаловать в комментарии.
+26
11 декабря 2009, 23:30
59

комментарии (47)

+31
nooze #
а где собственно обещанный «концепт»?
Я увидел только перечисление давно известных способов защиты с плюсами и минусами.
+1
CyMpak #
Концепт в собранности этих способов в одном месте и мысли, что можно их поюзать совместно. ) Ладно, если серьезно, то концепт действительно чересчур громкое слово, но статьи со всеми перечисленными способами я не встречал. Плюс до большинства из них я доходил сам.
+1
sshz #
До чего тут доходить, способам уже сто лет, тем более здесь не все

Проврка по e-mail + хорошая капча была бы лучше половины способов
0
CyMpak #
Про эти два способа действительно забыл, признаю. Их минус в том, что они явные и хотя не без геморроя, но обходятся. Плюс части описанных вариантов в том, что не ясно, что их нет. Вот пойди догадайся, что сервер следит за тем какой контент ты запрашиваешь и в каком порядке. )
0
mrhard #
а в чем тут собственно геморрой?
sshz привел 2ва реальных примера (а лучше всего их гибрид), которые создают геморрой для ботов, неудобство со стороны голосующего компенсируется осознанием своего голоса, а не случайным тыканием в радио-батоны… оставил голос, ввел e-mail, заполнил капчу, подтвердил голос ссылкой (к примеру) — голос засчитан.
0
sfghelios #
Понимаю, что вы говорили образно, но интернету точно еще 100 лет нет )
0
Delsian #
Гмейл игнорирует точки в имени пользователя. Итого простейший vasyapupkin@gmail.com даст тебе 1024 разных адреса :)
+2
itspoma #
Мой метод:
1) Создаём уникальный ID для пользователя и записываем его в сессию.
2) Отправляем фэйк форму пользователю например логин, пароль, кнопка
3) Привязываем к форме эвент onsubmit=«retun sendform()» (Функция в любом случае должна возвращать false)
4) Используя уникальный ID шифруем поля формы и отпровляем результат через jQuery Post на реальный скрипт.
5) Обновляем страницу

От чего мы избавляемся таким способом.
1) Пользователь спокойно может посылать данные.
2) Бот после обработки формы даже через Java не получит никаких важных данных
3) Бот не сможет анализировать POST заголовок для дальнейшего использования в корыстных целях.

Какие возникают проблемы.
1) У пользователя может быть просто отключен Javascript так в основном работают те люди которые много гуляют по разным сайтам.
2) Некоторые мобильные браузеры не понимают эвент onsubmit
+8
itspoma #
ещо вспомнилось, касательно капчи:
использовать на капче русские буквы.
(если спам-бот использует один из сервисов по распознаванию каптч — вероятность 3%-5% что по ту сторону будет человек с русской клавиатурой * 90%, что этот человек введет правильно и вовремя)
0
CyMpak #
Про русские буквы не знал, клево! Хотя свой скрипт пройдет, только его еще написать надо. )

Про капчу совсем из головы вылетело, надо в статью добавить.
–1
CyMpak #
Интересный вариант, в копилку способов его, но все равно не панацея. Вооружившись сниффером и разобрав содержимое страницы можно понять алгоритм, а затем спокойно его подделать.
+1
VasilioRuzanni #
Тут стоить отметить, что 100%-й панацеи и не существует. Иначе давно была бы уже.
НЛО прилетело и опубликовало эту надпись здесь
+1
MaEcTPo #
*поправил очки и включил зануду
Не называйте Javascript Java. Это же разные вещи.
*выключил зануду

За метод спасибо:)
+2
vpbar #
Добавлю.
6+ географическая локализация по IP видимо не всегда точно работает. Мне, например, такие сервисы говорят что я из Санкт Петербурга, хотя это не так. У остальных пользователей моего провайдера тоже самое.

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

На мой взгляд наиболее отсечь большую часть ботов можно использовав javascript. Передавать клиенту некий ключ, затем выбранное пользователем значение шифровать этим ключиком. Если при этом форма, куда вводится значение создается динамически скриптом на стороне клиента, то простым парсером или сниффером не обойтись, и придется использовать ботов основанных на браузерных движках. Или анализировать скрипты и эмулировать их работу. Для противодействия таким браузерным ботам надо генерировать случайные идентификаторы(классы) для полей ввода. И менять случайным образом их расположение на странице. Т.е. максимально затруднить автоматическое определение поля которое надо заполнить. Можно описание вариантов ответов делать картинками, что бы нельзя было определить по тексту куда флажок ставить. Естественно распознать можно все, но это усложнит работу ботописателям.
Если для flash нет декомпиляторов и у пользователей сайта есть flash, то можно использовать его. Если шифровать передаваемые данные, то сниффер не поможет. А автоматически определить куда надо тыкнуть мышкою во flash-е, на мой взгляд трудно.

+4
itspoma #
думаю параноики откажутся голосовать даже из под «privproxy+tor» )
0
vpbar #
Еще можно попробовать определять хистори пользователя, и на основе этой информации вычислять голосовал ли этот пользователь раньше или нет. Этот (тут ещё) способ определения хистори пока работает. Естественно, эту информация можно комбинировать с куками и информации о IP пользователя.
+1
EiZeRR #
У меня вопрос по поводу рассуждений про кукисы и хистори. А разве бот не может их просто удалить?
НЛО прилетело и опубликовало эту надпись здесь
+1
Ozamodaz #
Буквально сегодня я сам столкнулся с данной проблемой. Правда, я оказался не в роли организатора, а в роли участника. Мы выполнили все условия, сняли видео на заданную тему и так далее, залили, пропиарили среди друзей, а теперь нам пришло письмо, мол, вы подозреваетесь в накручивании голосов. Просят, чтобы мы скинули ссылки на упоминания о конкурсной работе в блогах, соц.сетях и тп. Я понимаю, что обеспечить справедливость голосования сложно, но, простите, чьи это проблемы?
+1
sunnybear #
у сотовых операторов есть наработанные методы в данной области. Можно с ними ознакомиться (если кратко, то часть была освещена в статье — кластеризация по параметрам, параметров может быть несколько десятков, вплоть до списка посещенных сайтов).
+4
Coolver #
На мой взгляд самым справедливым голосованием в большей части проводимых конкурсов является голосование с разрешённой накруткой, но с использованием сложной капчи. То есть, чтобы почти нельзя было автоматизировать процесс голосования с помощью распознавания «программно». А в остальном — пусть участники конкурса честно проявляют креативность и находчивость. Привлекают друзей, знакомых, социальные сети. Все возможные способы. И таким образом победит именно тот, кто действительно больше всего этого хочет и обладает хорошей поддержкой.
В противном случае, если использовать псевдо способы предотвращения многократного голосования одним человеком, то мы получаем гораздо больше проблем, которые делают сам процесс намного менее честным, чем в 1м варианте. В итоге всё равно многие способы защиты — обходятся. Есть различные прокси и аннонимайзеры. В итоге анализируя большинство конкурсов явно бросается в глаза, что победил либо «аццкий хаккер», либо кто-то из друзей/знакомых организаторов конкурса. Всё равно за «истинную» ценность работ почти никто не голосует. Все привлекают поддержку из друзей/знакомых. Так почему бы и не легализовать это?!)
0
mephisto #
Имхо, надо ставить пару явных видов защиты (капча, пункт 4 из вашего списка) и несколько неявных.
По явным — фильтровать голоса сразу.
По неявным — не фильтровать, однако при подсчете голосов тупо выкинуть все голоса, которые будут накручены, судя по этим методам.
–1
Coolver #
И вот мы делаем предположения по неявным в ту или иную удобную для нас сторону. То есть для участников процесс подсчёта голосов является некой вещью в себе, которая абсолютно не прозрачна и не формализованна. И даже если у участника явно больше голосов — он может и не победить. Ещё бывают забавные конкурсы, когда исключают в случае попыток многократного голосования и прочего. Самое интересное в этом варианте то, что конкуренты могут проголосовать таким не честным способом за своего соперника и исключить его из игры, так как он будет «подозреваться» в накрутке.
–1
mephisto #
Я имел ввиду не совсем это.
Я имел ввиду под «неявными» — те, которых не видит даже потенциальный накрутчик. То есть то, что непосредственно на фильтрацию голосов не влияет до момента завершения голосования.

Исключать действительно неверно, т.к. тут же найдутся конкуренты, которые так «завалят» противника.
Верно именно просто не учитывать накрученное.
0
advix #
В заголовке ошибка? «ЗАЩИТИТЫ»
+1
mrhard #
в личку обычно такое…
0
Chode #
iMacros или Xedant Emulator и половина стараний с js и прочими hidden полями напрасна, еще пару движений и все остальное тоже бесполезно.
0
hodik #
>> Самое красивое и технически на данный момент сложно обходимое решение — это привязка голоса к сотовому телефону. Так мы сразу записываемся в клуб по интересам с Vkontakte и «Одноклассниками», вызываем у пользователей приступ паранойи и при этом делаем все дорого и изящно. Еще можно и денежек немного подзаработать, если сделать голосование платным. ;) Но мы ведь хорошие парни, это не для нас.

В этот клуб надо сразу включить Гугл.
Отправка СМСки с кодом проверки — не дорогое удовольствие: 1,5 — 2 рубля. Отправка только по капче для сохранения денег. Для выявления накрутчиков, купивших много sim-карт, поможет кластеризация данных о голосовавших: IP-адреса, referer'ы, User-Agent и т.д.
0
CAH4A #
Вообще смс-ки — глупая защита.
1) лёгкий ДДОС и выборы сорваны
2) многие не захотят вообще писать свой телефон
3) Слабо маштабируемое решение. Проголосовало 20 — все хорошо. А вот если 10 000?

Поэтому высылать смску нужно после проверки на человека. То есть проверка на человека после проверки на человека. :)
+3
LDEV #
Самый лучший способ — это не говорить про защиту и про учтенные голоса. Тогда никто не узнает, а был ли засчитан голос и сколько их вообще :)
0
digi #
Согласен, только всё равно придётся объяснять, почему в списке претендентов одно положение участников, а в итоговой таблице другое.
0
LDEV #
Результаты оглашать по факту закрытия голосования.
0
benone #
Это снизит посещаемость:)
Участники наверняка каждые 10 минут хотят посмотреть на каком они месте:) + Стимул звать друзей на ресурс.
0
skvorets #
Возможен промежуточный вариант:
«Уважаемые участники, данные голосования на странице результатов обновляются один раз в час.»
И получается, что каждый конкретный голосовавший не видит мгновенного учета голоса
(будь то накрученный ботом или голос реального посетителя).
0
digi #
Это лотерея и для участников, и для организаторов.
Возможно, в некоторых случаях такой подход оправдан.
0
CAH4A #
А как вам такое — в хиден поле записываем таймстемп времени загрузки.
А потом пишем в базу время заполнения формы пользователем.

И в комбинации с третьим способом — мы однозначно выделим нужные голоса :)
0
Lux_In_Tenebris #
Таймстамп в скрытом поле в общем-то обнаруживается и успешно обходится/заполняется. Лучше запоминать его на стороне сервера, а пользователю выдавать ID сессии в куках.

Ещё в таком случае стоит добавить небольшой хак: не признаваться пользователю-боту, что его голос какой-то не такой и не был засчитан.
0
CAH4A #
Согласен с первым параграфом.

И со вторым тоже. :) Это правильно не давать обратной связи от блока защиты. :)
(И в десктопных приложениях тоже)
0
Lux_In_Tenebris #
Очень многие socks сервера дают новый ip адрес на каждое socket-соединение

Вы наверное «не» забыли у «многих». Мне такие если и встречались, то их дай бог 1% от всей массы. Конечный IP адрес скорее будут менять всевозможные proxy chainer'ы, но не думаю, что накрутчики станут использовать цепочки, достаточно просто скрыть себя, зайдя через один единственный SOCKS.

Автору стоило упомянуть возможность использования Flash и его собственных куки, которые средствами браузера очистить невозможно. Да и многие пользователи вообще не подозревают об их существовании. Но это защита только от голосования «одной толпой живых леммингов несколько раз в сутки».

И как насчёт привязки к e-mail с подтверждением по ссылке? Мало кому захочется регить десятки или сотни ящиков, учитывая, что везде нынче капчи.
0
alcr #
10minutemail.com и прочие… Можно конечно и их фильтровать, но я как то привык на всяком одноразовом мусоре не светить даже свой ящик-для-спама
0
SaveTheRbtz #
Есть предложение использовать более математический подход — считать «скорость голосования» для каждого отдельно взятого участника. Если, например, нарисовать график зависимости кол-ва голосов от времени то по нему явно будет видно, в какой момент пользователь:

* разместил на своём любимом форуме тему «Проголосуйте за меня»
* разослал по аське призыв проголосуй за меня, передай дальше
* создал группу вконтакте и пригласил всех друзей, а они своих
* запустил ботов которые накручивают через прокси голоса.
0
SaveTheRbtz #
Ну и конечно можно дополнительно юзать мой любимый приём — Flash local storage у 99%[citation needed] людей есть flash и мало кто знает, что у него тоже есть свои «куки».
Я пока не видел не одного рабочего бота который умел бы их переваривать =)
0
DnV #
вам написать? ;)
+2
Alekseo #
Самый лучший способ защиты от накруток — придумать модель голосования, где невозможно накручивать голоса.

Например попарное сравнение случайных девушек, как на www.babevsbabe.com/

В случае конкурса красоты это будет так: каждый раз при голосовании из всех конкурсанток случайным образом выбирается пара. А пользователь лишь выбирает какая девушка из двух красивее.

Есть и еще интересные варианты ;)
0
Rulez #
А можно примеры?
0
mrspender #
Дополню, есть специальный сервис, который предоставляет защиту от накруток — fairvote.ru

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