Javascript 防止用户单击的最佳方法';比如';多次

Javascript 防止用户单击的最佳方法';比如';多次,javascript,php,html,web,Javascript,Php,Html,Web,我正在为我正在工作的站点实现一个类似的功能。用户不必登录,他们可以喜欢或不喜欢某个特定页面。在这一切结束时,我希望能够填充一个最喜欢的文章或故事列表 我有一个非常简单的方法,目前使用onclick javascript函数通过ajax和php函数更新数据库。 这工作正常。我想做的是防止用户滥发按钮。 起初,我想获取IP地址,将其存储在数据库中,然后进行检查。有更好的方法吗?使用cookies。假设您有一个按钮,用户可以在其中喜欢文章123456789 <button id="like" a

我正在为我正在工作的站点实现一个类似的功能。用户不必登录,他们可以喜欢或不喜欢某个特定页面。在这一切结束时,我希望能够填充一个最喜欢的文章或故事列表

我有一个非常简单的方法,目前使用onclick javascript函数通过ajax和php函数更新数据库。 这工作正常。我想做的是防止用户滥发按钮。

起初,我想获取IP地址,将其存储在数据库中,然后进行检查。有更好的方法吗?

使用cookies。假设您有一个按钮,用户可以在其中喜欢文章123456789

<button id="like" articleID="123456789">Like</button>
Like
脚本:

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');
    }
}
函数setLike(articleID){
document.cookie=articleID+'=y';
}
函数(articleID){
var cookies=document.cookie.split(“;”);

对于(var i=0;i,只需在第一次单击按钮后将其隐藏即可


它甚至更有意义,当使用AJAX处理程序发送单击…

直接回答时,您将无法做到这一点

如果我真的想垃圾邮件你的“喜欢”按钮,我会找到一种方法,尤其是如果你不强迫我登录(我曾经写过相当好的机器人程序,并且对大型链接提交站点进行了相当高效的垃圾邮件发送)

Javascript只能阻止平庸的垃圾邮件发送者或袜子傀儡帐户持有者。作为一个垃圾邮件发送者,我可以很容易地绕过你的Javascript,或者通过编程一个基于时间的机器人来喜欢你的帖子,或者通过直接向你的服务器发送请求(我甚至不会加载你的网站)

如果你真的想阻止垃圾邮件发送者高效地发送此功能,你需要做的是(这里的关键词是效率,因为垃圾邮件发送者仍然可以发送你的功能,但他们喜欢的内容不算在内),记录每个喜欢帖子的IP及其地理信息(这并不总是100%准确,但这是一个好的开始),然后在后台运行一个过程,检查可疑的来源,并惩罚类似的人(要么给他们赋值较少,要么只是从总数中减去他们)

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

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

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

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

我不确定你在做什么样的项目,但如果是类似于链接提交的项目,不要根据喜欢的数量来排名(无论你的用户喜欢什么)


喜欢的数量应该只是一个因素,你可以看看HackerNews或Reddit对帖子的排名(那些项目是开源的),但这是多个因素的组合。

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

如果没有用户登录,就没有100%的防傻瓜方法。在数据库中记录IP地址将防止子网中的多人喜欢您的内容。如果没有登录,我建议使用cookie,但所有方法都会有问题。cookie可能有助于完成此任务。当用户单击
like
时存储cookie一次。然后在处理
时检查此cookie,如
单击。如果你想防止垃圾邮件单击,那么你可以实施定时IP阻止,如每小时一次,但这取决于你。嘿,史蒂夫,我也喜欢为非登录用户提供此类功能,但我仍然会记录用户记录,如你所说。只有IP地址,没有IP地址虽然其他实现(如cookie)有容易被欺骗的缺陷,但这种方法也有两个缺陷:1)用户可以轻松更改其ip地址2)两个来自同一网络的人被视为一个用户。所以你决定,但在我看来,试着依靠你服务器上的数据,而不是用户计算机上的数据。这是一个相当全面的答案。如果网站达到这种状态,我会对自己留下深刻印象:)谢谢,我真的应该更多地了解coookies,它们仍然让人望而生畏 :(一点也并没有,但你们看到的所有脚本都让它变得如此困难和困难,太夸张了。它只不过是一个可以拆分或解析的字符串。我正在尝试使用一个我已经准备好的ajax调用来处理这个问题。你们能说我可能出了什么问题吗?并没有任何区别。我不确定该在哪里查找问题,但我知道假设HasLike没有被设置,否则ajax调用就不会发生。你不能设置一个JSFIDLE吗?讨厌pastebin,它让我做噩梦。删除一些评论,我就删除我的。所以不喜欢广泛的争论。$concienceKey非常适合在德国的数据保护法中使用。不需要在数据库中保存IP,ins我用的是md5哈希键。太好了!很高兴它帮了你,马丁!