А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/golos/
Rambler's Top100
Пишем на PHP: Голосование, защита от накруток

Ну что, уже заскучали без меня?

Ничего, я вас не кину. Пока сами не умучаетесь читать "записки старого бездаря". Морочу я вам голову, а сам — дуб дубом. И чем старше становлюсь, тем больше в этом убеждаюсь.

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

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

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

На форуме есть трид "Куда дальше?", в котором мне предлагают различные темы для грядущих выпусков. Вот мне понравилась идея "про голосования". Об этом и поговорим в двух(?) грядущих выпусках.

Что же это такое — голосование на сайте.

В общем, мы чаще всего сталкиваемся с двумя видами голосования в Сети.

Первый — голосование по вопросникам: когда нас что-то неожиданно спрашивают и требуют немедленно выбрать наиболее симпатичный вариант и нажать на кнопку.

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

Оба варианта сильно похожи "снаружи", т.е. для пользователя. Но сильно разняться для владельца сайта.

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

Что такое "накрутка"? Боже мой, Киса, это же так просто...

Предположим, что вы решили разместить на Конкурсе Юмора свою нетленку. Разместили. Но тут вам, вдруг, захотелось продвинуть свое творение повыше в рейтинге. Т.е. накрутить рейтинг. Что вы для этого сделаете? Правильно: сначала вы проголосуете за себя сам, затем попросите проголосовать за вас ваших друзей. Если этого окажется мало, вы начнете изображать из себя разных людей и продолжать ставить оценки от "чужого имени". И если система вздумает с вами начать бороться, вы начнете искать всевозможные способы обхода "защиты от накруток": будете менять браузеры, компьютеры, бродя по офису или без конца перезванивая провайдеру, чтобы получить новый IP-адрес. Кто "хитрее" — начинают подставлять в настройки браузера разные открытые proxy, чистить cookie-лист и так далее.

Таки образом, вы накручиваете рейтинг своей любимой работе, выдвигая ее все выше и выше.

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

В общем, накрутка рейтинга — великое и интересное занятие.

Но еще более интересное занятие — ловить накрутки.

Быть разведчиком — интересно. Но быть контрразведчиком — еще интереснее. При определенном складе ума, конечно.

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

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

Спросите, почему бы мне не реализовать свои знания на том же 21.ru? "А зачем?", — отвечу я вам! Мне приятно, что авторы волнуются за свои тексты и рвутся на сайт со всех доступных компьютеров, чтобы поставить очередную "пятерку" себе и "пару" — сопернику. Достаточно того, что я сам знаю настоящих лидеров и указываю на них в момент выдачи очередного приза. Ох, как в этот момент начинают бить себя в грудь накрутчики, доказывая, что на самом деле первые — они.

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

Второе правило несколько сложнее в формулировании. Я его попробую не сформулировать, а описать.

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

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

Так что же нам делать, как защититься?

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

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

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

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

Показываю на простом примере.


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


Предположим, что я все-таки разместил в конце страницы голосовалку и решил защититься от накруток, как пошла бы моя мысль?

Примерно так: "Обыкновенный пользователь отличается от повторного прежде всего тем, что читает содержимое страницы. То есть, тратит на это время. Значит, если посетитель потратил на страницу мало времени, значит ему не интересно содержимое и голосовать ему нет никакой необходимости, — это накрутчик, который по своей инициативе или по чьей-то просьбе зашел на сайт поставить оценку".

И исходя из этой мысли я строю защиту:

1. Создаю таблицу, в которой незаметно регистрирую всех посетителей:
- IP-адрес посететеля
- xIP-адрес посетителя (это реальный IP, который показывают честные proxy-серверы)
- дату и время запроса страницы
- cookie-запись в виде уникального идентификатора посетителя (можно использовать порядковый номер записи в этой таблице)

2. Создаю таблицу голосования
- IP-адрес проголосовашего
- xIP
- дату и время
- cookie
- оценку

3. Пишу скрип заполнения первой таблицы и размещаю его в начале страницы. Этот скрипт отрабатывается всегда, при запросе страницы.

4. Пишу скрипт заполнения второй базы и размещаю его в новом файле, который вызывается при нажатии на кнопку голосования.

5. Пишу анализатор, который запускаю когда хочу и как хочу.

С первыми четырьмя пунктами все понятно. А как работает пятый?

Анализатор работает разными способами: от анализа технических данных, до моих "уникальных" формулах анализа.

Например.

Скрипт из пункта 3 должен создавать в базе 1 новую запись, брать ее уникальный ID и записывать его в браузер клиента, в cookie.

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

Таким образом, если в базе 2 есть номер cookie, то он обязательно должен присутствовать в базе 1. Если это не так, значит номер вымышленный и голос можно легко считать накрученным.

Если в базе 2 поле cookie пусто, это значит, что или голос накрученный, или у клиента должны быть отключены куки. Считать такой голос или нет? Это ваше дело. Я бы отметил его как подозрительный и обработал отдельно.

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

И так далее, пока не кончится у вас фантазия по сравнению адресов, кук и любых других данных.

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

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

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

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

Главное, помните про первое правило "контрнакрутчика" и хорошо подумайте над вторым. Все стандартные и технические способы уже изучены и подробно описаны во всяких "руководствах".

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

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

До завтра!

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin