Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от повторного голосования
 
 автор: ПБ (Дмитрий)   (29.08.2004 в 03:03)   письмо автору
 
 

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

   
 
 автор: glsv (Дизайнер)   (29.08.2004 в 03:55)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 03:03)
 

Ссылки на просмотр действительно нет :( Поправим.

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

>А раз мне дается возможность проголосовать еще раз, значит я считаюсь не проголосовавшим.
Защита строится на основе проверки IP-адресов проголосовавших. Один IP-адрес не может проголосовать больше чем раз в определенный период времени (он указан в скрипте). Если это период истек, то считается, что IP-адрес не голосовал.
Это вот из каких соображений сделано:
1. Если кто-то очень сильно захочет накрутить результаты подобного голосования - он все равно это сделает. :(
2. Если мы поставим защиту на основе cookies, то мы либо откроем большую дыру для посетителей с отключенными куками, либо совсем запретим таким людям голосовать. И то и другое совсем не приемлимо. Потому была выбрана защита по IP.
3. Подавлющее большинство людей выходит в инет по либо диапапу, либо через прокси-сервера. Т.е. под одним IP может посещать сайт очень большое число людей. Т.е. просто запрещать IP-адрес для дальнейшего голосования - нельзя.
4. И все же большинство накруток - это чистое баловство. Когда просто нажимают на кнопку голосования несколько раз за пару секунд. И если это не сработало, то дальнейших действий по накрутке не предпринимают. А если действия по накрутке продолжаюся, то см. пункт 1.

Вот поэтому была сделана такая защита. С удовольствим выслушаем Ваши соображения. Может быть можно сделать и по другому.

   
 
 автор: ПБ (Дмитрий)   (29.08.2004 в 08:33)   письмо автору
 
   для: glsv (Дизайнер)   (29.08.2004 в 03:55)
 

>Поскольку все равно нельзя строго соблюсти условия "чистого" голосования, то видит посетитель результаты, не видит - большой разницы нет.
Ну в этом ракурсе - да.
>Один IP-адрес не может проголосовать больше чем раз в определенный период времени (он указан в скрипте).
Видимо здесь
AND puttime>date_sub(now(), interval '2' minute)";

А какие еще параметры есть, кроме минут, например, часы или сутки?
>Если мы поставим защиту на основе cookies, то мы либо откроем большую дыру для посетителей с отключенными куками, либо совсем запретим таким людям голосовать.
А почему не совместить два варианта? Если cookies отключены, то проверяем по IP-адресу.

   
 
 автор: glsv (Дизайнер)   (29.08.2004 в 10:00)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 08:33)
 

>А какие еще параметры есть, кроме минут, например, часы или сутки?
Ну все те что определяют время и дату. Секунды, минуты, часы, дни, месцы, год и их комбинации.
Внизу по ссылке - доки на функции MySql по работе со временем.

>А почему не совместить два варианта? Если cookies отключены, то проверяем по IP-адресу.
Вообще говоря, Да - это самый лучший вариант.
Ну чтож - когда снова возьмем этот скрипт на доработку - нужно будет добавить защиту по cookies.

   
 
 автор: Artem S.   (29.08.2004 в 09:01)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 03:03)
 

В прошлой теме я давал скрипт, вот он

show_poll.php
<?php
  
include_once "poll/config.php";
  
// Отображаем результаты
  
$pol mysql_query("SELECT * FROM poll WHERE archive=0 AND hide=0");
  if (
$pol)
  {
    
$poll mysql_fetch_array($pol);
    echo 
$poll['name']."<br>";
    
// Просматриваем вопросы опроса
    
$query "SELECT * FROM answer
              WHERE id_poll="
.$poll['id_poll']."
              ORDER BY pos"
;
    
$total "SELECT SUM(hit) FROM answer WHERE id_poll=".$poll['id_poll'];
    
$ans mysql_query($query);
    
$tot mysql_query($total);
    if(
$ans && $tot)
    {
      
$totl mysql_fetch_array($tot);
      
$totalhits $totl['SUM(hit)'];
      if(
$totalhits == 0$totalhits 1;
      echo 
"<table border=0>";
      while(
$answer mysql_fetch_array($ans))
      {
        echo 
"<tr>
               <td>"
.$answer['name']."</td>
               <td>"
.$answer['hit']."</td>
               <td>"
.sprintf("%01.1f%s"$answer['hit']/$totalhits*100,'%')."</td>
              </tr>"
;
      }
      echo 
"</table>";
      echo 
"Общее число проголосовавших составляет: ".$totl['SUM(hit)']."<br>";
      echo 
"<a href=archive.php>Архив голосований</a><br>";
    } else 
puterror("Ошибка при обращении к блоку голосования");
  } else 
puterror("Ошибка при обращении к блоку голосования");
?> 

и вставляешь ссылку на этот файл.
<a href="poll/showpoll.php>Результаты</a> Или include этот файл

   
 
 автор: ПБ (Дмитрий)   (29.08.2004 в 09:24)   письмо автору
 
   для: Artem S.   (29.08.2004 в 09:01)
 

В файле vote.php есть кусок с выводом итогов голосования. Но перед ним идет зачет самого голосования.
Разумнее, имхо, сделать проверку, с какой ссылки пришли на эту страницу (как не помню). И если со ссылки просмотра, то пропускать кусок с зачетом. Либо, что мне представляется лучшим, выделить кусок вывода итогов в отдельный файл, а в vote.php вставлять его при помощи include.
А чем простой include отличается от include_once ?

   
 
 автор: glsv (Дизайнер)   (29.08.2004 в 10:10)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 09:24)
 

>Либо, что мне представляется лучшим, выделить кусок вывода итогов в отдельный файл, а в vote.php вставлять его при помощи include.

Можно и так.

>include отличается от include_once ?
Подключаемый файл подключается только один раз даже если вызовов include было несколько.

Например, Artem S. привел скрипт отображения итогов.
Его можно использовать отдельно, а можно подключать в vote.php. В vote.php уже есть include конфигурационного файла. И если мы в show_poll.php снова бы подключали конфигурационный файл с помощью include, то появилась бы ошибка. А include_once не подключает файл, если он уже был подключен.

   
 
 автор: ПБ (Дмитрий)   (29.08.2004 в 12:37)   письмо автору
 
   для: glsv (Дизайнер)   (29.08.2004 в 10:10)
 

Что-то у меня не получается к кнопке, которую я приделываю рядом с кнопкой "Голосовать", прицепить ссылку, чтобы открывался нужный мне файл. И найти пример нигде не могу. Это вообще возможно?

   
 
 автор: glsv (Дизайнер)   (29.08.2004 в 13:43)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 12:37)
 

>не получается к кнопке, которую я приделываю рядом с кнопкой "Голосовать", прицепить ссылку

Так и не надо ставить еще одну кнопку - поставь просто ссылку.

<a href="show_vote.php">Посмотреть результаты</a>


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

   
 
 автор: ПБ (Дмитрий)   (30.08.2004 в 20:55)   письмо автору
 
   для: glsv (Дизайнер)   (29.08.2004 в 13:43)
 

Забавная штука.
Поставил ссылку на файл show_vote.php
Файл vote.php оставил без изменений. Голсую, кол-во проголосовавших увеличивается на 1. Нажимаю на просмотр результатов, всё по-старому. Всё это происходит в IE. Открываю show_vote.php в Netscape, делаю reload, значение меняется. После этого обновляю в IE, обновилось.
Теперь ставлю в файл show_vote.php мета-теги, которые вы предлагали в теме по кэшированию. Снова голосую. Результат тот же. Но теперь после reload в Netscape, значение меняется, а вот после обновления в IE ничего не изменилось. Получилось два окошка с одним файлом, обновляю оба, в одном окне одно число, а в другом - другое!!!

   
 
 автор: glsv (Дизайнер)   (30.08.2004 в 21:55)   письмо автору
 
   для: ПБ (Дмитрий)   (30.08.2004 в 20:55)
 

>Получилось два окошка с одним файлом, обновляю оба, в одном окне одно число, а в другом - другое!!!

Мистика :)
Иногда происходят такие мистические вещи, которые нельзя объяснить. Наверное есть какое то разумное объяснение этому, но, видимо, оно пока недоступно для нашего понимания :))

PS: проверяете на хостинге или на локальном хосте?

   
 
 автор: ПБ (Дмитрий)   (30.08.2004 в 22:05)   письмо автору
 
   для: glsv (Дизайнер)   (30.08.2004 в 21:55)
 

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

   
 
 автор: J.Lex   (29.08.2004 в 18:30)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 03:03)
 

хмм зачем мутить?
проще сделать проверку по куксам,если голосовал то выводиться только результаты,если не голосовал то выводить форму!
так гораздо проще!

проверка по IP это да,но взять хотябы 6 пользователей работающие на 1 IP и что один проголосовал а все остальные просто будут сидеть и думать когдаж они голосовали!

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

   
 
 автор: cheops   (29.08.2004 в 19:56)   письмо автору
 
   для: J.Lex   (29.08.2004 в 18:30)
 

>проверка по IP это да,но взять хотябы 6 пользователей
>работающие на 1 IP и что один проголосовал а все остальные
>просто будут сидеть и думать когдаж они голосовали!
Так как IP-адрес хранится лишь несколько минут, вероятность того, что 6 человек будут голосовать одновременно не велика

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

   
 
 автор: J.Lex   (29.08.2004 в 20:01)   письмо автору
 
   для: cheops   (29.08.2004 в 19:56)
 

хорошо одбросим пример с куками, ip все равно заноситься в бд
и перед тем как показать форму или результаты проверка ip в бд если голосовал показать ТОЛЬко результаты,если нет форму!тогда и куксы не нужны!

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

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

   
 
 автор: cheops   (29.08.2004 в 21:09)   письмо автору
 
   для: J.Lex   (29.08.2004 в 20:01)
 

>и еще в вашей админ страничке не учтено создания 2,3 или
>более голосований одновременно!предположим хочу я на каждую
>из сылок закинуть голосование но с вашей системой у меня это
>не получиться!
Да не учтено :))) и это хорошо, что Web-приложение побуждает к совершенствованию системы посетителем. Что ж хорошего будет в том, что человек его передерёт без творческой переработки? :))) Со временем, конечно, это Web-приложение не минуемо подвергнется переработки, будут и cookie и более надёжный механизм защиты, а пока пусть будет так :))) Всё таки должны время от времени люди восклицать: "Да что же это такое в самом деле?! Во всём рунете нет ни одной приличной системы голосования!!! :]" и творить после этого.

   
 
 автор: ПБ (Дмитрий)   (29.08.2004 в 21:14)   письмо автору
 
   для: J.Lex   (29.08.2004 в 20:01)
 

>хорошо одбросим пример с куками, ip все равно заноситься в
>бд
>и перед тем как показать форму или результаты проверка ip в
>бд если голосовал показать ТОЛЬко результаты,если нет
>форму!тогда и куксы не нужны!
Кажется ты сам себе противоречишь. Ведь с одного ip может быт масса пользовотелей. А т.к. здесь используется временной интервал, то получится, что если я перезагружаю страницу в этом интервале, то виже результаты, а после - опять форму.

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

   
 
 автор: glsv (Дизайнер)   (29.08.2004 в 21:19)   письмо автору
 
   для: J.Lex   (29.08.2004 в 20:01)
 

>если голосовал показать ТОЛЬко результаты,если нет форму!

А зачем огород городить? Есть такая штука - "интуитивный интерфейс", под которой много чего понимается. Так вот - такое поведение будет "неестественно" для большинства систем голосований в инете. То появляющаяся, то изменяющаяся форма только вызовет "непонятки" у посетителей - "Отчего исчезло? Почему появилось?". Посетителю не нужно задавать лишних вопросов и заставлять разбираться в измудрениях разработчиков. Пусть вопросы себе задают сами разработчики.

>да и зачем даже при очень серьезной системе голосования использовать мыло для потверждения это глупо,тогда лучше после системы регистрации и в входа на сайт через логин и пароль выводить голосование!

Простая регистрация на сайте (которую Вы предлагаете) позволит завести сколько угодно новых логинов и "накрутить" голосование. Завести сколько угодно "НЕбесплатных" e-mail-ов довольно затруднительно.

>и еще в вашей админ страничке не учтено создания 2,3 или более голосований одновременно!
Да, не учтено. Давайте доработаем ее вместе :)

   
 
 автор: ПБ (Дмитрий)   (30.08.2004 в 06:36)   письмо автору
 
   для: ПБ (Дмитрий)   (29.08.2004 в 03:03)
 

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

   
 
 автор: glsv (Дизайнер)   (30.08.2004 в 21:56)   письмо автору
 
   для: ПБ (Дмитрий)   (30.08.2004 в 06:36)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования