Django中的垃圾邮件证明命中计数器

Posted

技术标签:

【中文标题】Django中的垃圾邮件证明命中计数器【英文标题】:Spam proof hit counter in Django 【发布时间】:2010-11-15 19:14:19 【问题描述】:

我已经查看了最流行的 Django 计数器解决方案,但似乎都没有解决刷新按钮垃圾邮件的问题。

我是否真的必须记录每个访问者的 IP,以防止他们通过向刷新按钮发送垃圾邮件(或编写快速而肮脏的脚本)人为地增加页面浏览量为他们做)?

更多信息

所以现在您可以使用以下几行 Python 代码来增加您的观看次数。这太少了,您实际上不需要编写脚本,您只需将其输入到交互式会话中即可:

from urllib import urlopen

num_of_times_to_hit_page = 100
url_of_the_page = "http://example.com"

for x in range(num_of_times_to_hit_page):
    urlopen(url_of_the_page)

我可能会使用的解决方案

对我来说,当您需要在每个页面视图上对数据库进行大量写入时,这是一个相当艰难的情况,但我想这无济于事。由于几个用户人为地夸大了他们的查看次数,我将实施 IP 日志记录。不是他们是坏人,甚至不是坏用户。

请参阅有关解决缓存问题的答案...我将首先遵循该路线。将更新结果。

不管怎样,Stack Overflow 似乎正在使用 cookie(我无法增加自己的查看次数,但当我在另一个浏览器中访问该网站时它会增加。)

我觉得好处太多了,这种‘作弊’现在太容易了。

感谢大家的帮助!

【问题讨论】:

【参考方案1】:

记录 IP 可能是最安全的。它并不完美,但它比 cookie 更好,并且比要求注册对用户来说更不烦人。也就是说,我建议不要将这些保存在数据库中。相反,请使用 Django 的low-level caching framework。关键是 ip,值是一个简单的布尔值。即使是基于文件的缓存也应该非常快,但如果您真的期望流量很大,请使用 memchached 作为缓存后端。

这样的事情应该可以工作:

ip = request.META['REMOTE_ADDR']
has_voted = cache.get(ip)
if not has_voted:
    cache.set(ip, True)
    #code to save vote goes here

【讨论】:

我应该补充一点,您需要将缓存 TTL 设置为合理的值,例如一个小时:cache.set(ip, True, 60 * 60) 谢谢...这比我认为我必须要做的大而慢的 db ip logging 更好更简单...我必须记住以后不要愚蠢;)【参考方案2】:

没有万无一失的方法可以防止有人人为地夸大计数。相反,您愿意在多大程度上花时间让他们更难做到这一点:

根本没有(他们点击刷新按钮) 设置 cookie,检查 cookie 以查看它们是否已经存在(它们会清除 cookie) 记录IP地址(每次都伪造不同的IP) 要求使用他们回复的电子邮件登录(他们注册了多个电子邮件帐户)

因此,最后,您只需要选择您想要达到的努力程度,以防止用户滥用系统。

【讨论】:

现在您可以使用 4 行 python 脚本来增加您的查看次数:( 从 urllib 导入 urlopen;对于范围内的 x (100): urlopen('addressofpage.com') 制作一个 2 行 python 脚本 :(【参考方案3】:

您可以在他们访问时向他们发送一个 cookie,然后检查该 cookie。还是可以玩的,但是难度有点大。

【讨论】:

以上是关于Django中的垃圾邮件证明命中计数器的主要内容,如果未能解决你的问题,请参考以下文章

django-celery-beat 垃圾邮件到期任务

如何获得垃圾邮件中的突出词 - 非垃圾邮件分类器?

WordPress 和 BuddyPress 垃圾邮件预防

停止没有验证码的垃圾邮件

Exchange 2010垃圾邮件功能开启及白名单设置

易宝典文章——玩转Office 365中的Exchange Online服务 之二十四 配置垃圾邮件筛选器反垃圾邮件