防止用户多次点击“喜欢”的最佳方法

时间:2013-09-23 17:26:20

标签: javascript php html web

我正在为我正在开发的网站实施类似的功能。用户不必登录,他们可以喜欢或不喜欢特定页面。在最后,我希望能够填充最喜欢的文章或故事列表。

我有一个非常简单的方法,目前使用onclick javascript函数通过ajax和php函数更新数据库。 这工作正常。我想做的是防止用户发送垃圾邮件。
起初我想到了可能获取IP地址,将其存储在数据库中然后运行检查。还有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

直接回答,你将无法做到。

如果我真的想要垃圾邮件你的“喜欢”按钮,我会找到一种方法,特别是如果你不强迫我登录(我曾经写过很好的机器人,并且非常有效垃圾邮件大链接提交网站)。

Javascript只会阻止平庸的垃圾邮件发送者或袜子木偶帐户持有者。作为垃圾邮件发送者,我可以非常轻松地规避您的Javascript,无论是通过编写基于时间的机器人来发布您的帖子,还是直接向您的服务器发送请求(我甚至不会加载您的网站)。

你需要做什么,如果你真的想阻止垃圾邮件发送者滥用此功能有效(效率是这里的关键字,因为垃圾邮件制造者仍然可以垃圾邮件你的功能,但他们的喜欢不会计算在内)是记录每个喜欢帖子的IP及其地理信息(它并不总是100%准确,但这是一个好的开始)然后在后台运行一个过程,检查可疑的起源并惩罚这些喜欢(通过分配它们)较少的价值,或只是从总数中减去它们)。

例如,如果你的主要观众是居住在美国的人,但是有一个帖子得到了来自墨西哥,萨尔瓦多,印度,澳大利亚,俄罗斯的一堆喜欢,那么很可能是代理人或者背后的垃圾邮件发送者类似于TOR的网络,他/她可以随意改变他/她的IP地址。

在几十万条记录之后,您将有一个良好的基础来开始将IP地址列入黑名单。我通常使用R编程语言来获取有关我的数据库的统计信息。

然而,一个好的垃圾邮件发送者可以使用来自受众国家或地理位置的受感染计算机的IP地址列表,并使用这些IP来滥用该功能。这些机器人很难被发现,但您可以分析之前的帖子,并提出有用的指标作为“喜欢/评论比率”。

如果一个帖子有大量的喜欢,但评论数量很少,那么很可能有人发送垃圾邮件,但是我可以再次编程我的机器人喜欢并发表评论,这样数字看起来很自然。

我不确定你正在做什么样的项目,但如果它与链接提交类似,不要按喜欢的数量排名(无论用户喜欢什么)。

喜欢的数量应该只是一个因素,您可以看看HackerNews或Reddit如何对帖子进行排名(这些项目是开源的),但它是多个因素之间的组合。

答案 1 :(得分:3)

从技术上讲,没有一种防弹方法可以做到这一点。你可以通过允许每个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;

答案 2 :(得分:2)

首次点击按钮后,只需隐藏按钮即可。

当使用AJAX处理程序发送点击时,它甚至更有意义......

答案 3 :(得分:1)

使用cookies。假设你有一个按钮,用户可以在这里找到文章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');
    }
}

当然,用户可以删除他或她的所有Cookie - 但用户也可以喜欢来自100台不同计算机的同一页/文章。以上情况可以防止最常见的情况:人们在很短的时间内从同一台计算机上反复点击喜欢或不喜欢。