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中的垃圾邮件证明命中计数器的主要内容,如果未能解决你的问题,请参考以下文章