4

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

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

4

4 回答 4

6

从技术上讲,没有防弹方法可以做到这一点。通过允许每个 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;
于 2013-09-23T18:39:35.110 回答
5

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

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

Javascript 只会阻止平庸的垃圾邮件发送者或 sock puppet 帐户持有人。作为垃圾邮件发送者,我可以很容易地绕过您的 Javascript,方法是编写一个基于时间的机器人来喜欢您的帖子,或者直接向您的服务器发送请求(我什至不会加载您的网站)。

如果您真的想防止垃圾邮件发送者有效地向此功能发送垃圾邮件(效率是这里的关键字,因为垃圾邮件发送者仍然可以向您的功能发送垃圾邮件,但他们的点赞不算数),您需要做的是记录每个喜欢帖子的 IP使用它的地理信息(它并不总是 100% 准确,但这是一个好的开始),然后在后台运行一个进程来检查可疑来源并惩罚此类喜欢(通过为它们分配较少的值,或者只是从总数中减去它们数数)。

例如,如果您的主要受众是居住在美国的人,但一个帖子获得了来自墨西哥、萨尔瓦多、印度、澳大利亚、俄罗斯的大量点赞,那么很可能是在代理或类似的网络背后存在垃圾邮件发送者TOR和他/她可以随意更改他/她的IP地址。

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

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

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

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

点赞数应该只是一个因素,你可以看看 HackerNews 或 Reddit 是如何对帖子进行排名的(那些项目是开源的),但它是多个因素的组合。

于 2013-09-23T18:25:21.683 回答
2

只需在第一次单击按钮后将其隐藏即可。

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

于 2013-09-23T17:52:54.043 回答
1

使用 cookie。假设您有一个按钮,用户可以在其中喜欢文章 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 台不同计算机的相同页面/文章。以上防止了最常见的情况:人们在很短的时间内从同一台计算机上重复点击喜欢或不喜欢很多次。

于 2013-09-23T17:48:04.463 回答