防止用户多次单击“喜欢”的最佳方法
Best way to prevent a user clicking 'like' multiple times
我正在为我正在处理的网站实现一个类似的功能。 用户不必登录,他们可以喜欢或不喜欢特定页面。 最后,我希望能够填充一个喜欢最多的文章或故事列表。
我有一个非常简单的方法,目前使用 onclick javascript 函数通过 ajax 和 php 函数更新数据库。这工作正常。 我想做的是防止用户向按钮发送垃圾邮件。
起初我想到可能获取IP地址,将其存储在数据库中,然后运行检查。 有没有更好的方法?
从技术上讲,没有防弹的方法可以做到这一点。您可以通过允许每个IP用户代理组合进行一票来非常接近。您必须在服务器端实现这一点。
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;
直截了当的答案,您将无法做到。
如果我真的想向你的"喜欢"按钮发送垃圾邮件,我会找到一种方法来做到这一点,特别是如果你不强迫我登录(我曾经写过很好的机器人,并且非常有效地向大链接提交网站发送垃圾邮件(。
Javascript只会阻止平庸的垃圾邮件发送者或袜子傀儡帐户持有人。作为一个垃圾邮件发送者,我可以很容易地绕过你的Javascript,要么通过编程一个基于时间的机器人来喜欢你的帖子,要么直接向你服务器发送请求(我什至不会加载你的网站(。
如果你真的想防止垃圾邮件发送者有效地向这个功能发送垃圾邮件(效率是这里的关键词,因为垃圾邮件发送者仍然可以向你的功能发送垃圾邮件,但他们的喜欢不算在内(是记录每个喜欢帖子的IP及其地理信息(它并不总是100%准确,但这是一个好的开始(,然后在后台运行一个过程,检查可疑来源并惩罚这样的喜欢(要么通过为它们分配较少的值,要么只是从总数中减去它们(。
例如,如果您的主要受众是居住在美国的人,但一个帖子获得了来自墨西哥、萨尔瓦多、印度、澳大利亚、俄罗斯的大量赞,那么很可能在代理或类似于 TOR 的网络背后有一个垃圾邮件发送者,他/她可以根据他/她的意愿更改他/她的 IP 地址。
在几十万条记录之后,您将有一个良好的基础来开始将 IP 地址列入黑名单。我通常使用 R 编程语言来获取有关数据库的统计信息。
但话又说回来,一个好的垃圾邮件发送者可能会使用来自受众所在国家或地理位置的受感染计算机的 IP 地址列表,并使用这些 IP 滥用该功能。这些机器人更难发现,但您可以分析以前的帖子并提出有用的指标,如"喜欢/评论率"。
如果一个帖子有大量的喜欢,但评论数量很少,那么很可能有人向它发送了垃圾邮件,但话又说回来,我可以对我的机器人进行编程以喜欢并发表评论,这样数字看起来很自然。
我不确定你正在做什么类型的项目,但如果它类似于链接提交,请不要按喜欢的数量对(无论你的用户喜欢什么(进行排名。
喜欢的数量应该只是一个因素,你可以看看HackerNews或Reddit如何对帖子进行排名(这些项目是开源的(,但它是多个因素的组合。
第一次单击按钮后将其隐藏即可。
当使用 AJAX 处理程序发送点击时,它甚至更有意义......
使用 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台不同计算机的同一页面/文章。以上防止最常见的情况:人们在短时间内从同一台计算机上重复点击喜欢或不喜欢很多次。
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 有条件更新d3.js力图中节点的最佳方法
- 为react组件传递道具的最佳方式
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- Angularjs 1.5.x本地化最佳实践
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- MobileFirst:在客户端运行计时器作业-最佳选项
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 从数组中删除元素的最佳方法是:javascript/jquery
- 链接两个网页或网络应用程序的最佳方式
- 什么's是连接供应商js文件的最佳方式
- Express服务器中语言子域的最佳实践
- 什么's是在javascript中迭代项的最佳方式
- 防止用户多次单击“喜欢”的最佳方法