2013-09-23 5 views
2

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

У меня есть очень простой метод, который в настоящее время использует функцию javascript onclick для обновления базы данных через ajax и php-функцию. Это работает нормально. То, что я хотел бы сделать, не позволяет пользователю спамить кнопку.
Сначала я подумал, что возможно получить IP-адрес, сохранив его в базе данных, а затем запустив чек. Есть ли способ лучше?

+3

Не имея логин пользователя нет 100% дурака способ сделать это. Запись IP-адреса в вашей базе данных предотвратит попадание нескольких пользователей в подсеть из Liking вашего контента. – MonkeyZeus

+0

Без регистрации? Я бы предложил cookie, но все подходы будут иметь проблемы. – mccainz

+0

cookie может помочь в решении этой задачи. Храните файл cookie, когда пользователь однажды нажал 'like'. И проверьте этот файл cookie при обработке 'like' click. –

ответ

1

Использование печенья. Допустим, у вас есть кнопка, где пользователь может нравится статья 123456789

<button id="like" articleID="123456789">Like</button> 

сценарий:

function setLike(articleID) { 
    document.cookie=articleID+'=y'; 
} 

function hasLiked(articleID) { 
    var cookies=document.cookie.split(';'); 
    for (var i=0;i<cookies.length;i++) { 
     var cookie=cookies[i].split('='); 
     if (cookie[0]==articleID) return true; 
    } 
    return false; 
} 

var button=document.getElementById('like'); 

button.onclick=function() { 
    var articleID=this.getAttribute('articleID'); 
    if (!hasLiked(articleID)) { 
     //register the like in your system 
     //... 
     // 
     setLike(articleID); 
    } else { 
     alert('You cant like or dislike an article twice'); 
    } 
} 

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

+0

Благодарим вас, я действительно хочу узнать о коучках больше, они все еще унылые :( – null

+0

Совсем не все, но все скрипты, которые вы видите вокруг, делают это настолько трудным и трудным, переполняют его. Это не что иное, как строка, которую вы можете разделить или parse. – davidkonrad

+0

Я пытаюсь работать с этим с помощью ajax-звонка, который у меня уже есть. Вы можете сказать, где я могу ошибиться? – null

1

Просто скройте кнопку после того, как она была нажата в первый раз.

Он даже имеет больше смысла, когда с помощью обработчика AJAX для отправки нажмите ...

4

прямой ответ, вы не будете в состоянии сделать это.

Если я действительно хочу, чтобы СПАМ был похож на «понравившуюся» кнопку, я найду способ сделать это, особенно если вы не заставляете меня заходить (я использовал для написания хороших ботов и был довольно эффективным спамом сайты подачи больших ссылок).

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

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

Например, если ваша основная аудитория - это люди, живущие в Соединенных Штатах, но одна почта получает кучу симпатий из Мексики, Сальвадора, Индии, Австралии, России, то более чем вероятно, что есть спамер за прокси или сеть, подобная TOR, и он/она может изменить свой IP-адрес по своей воле.

После нескольких сотен тысяч записей у вас будет хорошая база для запуска черного списка IP-адресов. Я обычно использую язык программирования R для получения статистической информации о моих базах данных.

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

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

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

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

+0

Это довольно полный ответ. Если сайт когда-либо доберется до такого статуса, я буду очень впечатлен собой :) – null

2

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

PHP Пример

$concienceKey = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['USER_AGENT']); 

$query = "SELECT COUNT(*) FROM clickConcience WHERE key = `" . $concienceKey . "`"; 

//run your query 
//.....and get the $count; 
// 

//already voted! 
if($count > 0){ 
     echo 'already voted'; 
     return false; 
} 

//remember entry 
$insert = "INSERT INTO clickConcience (key, datetime) VALUES (`" . $concienceKey . "`, NOW())"; 

//run your query 
//.....and insert 
// 

return true; 
Смежные вопросы