0

我的 django 项目有一个用户模型,它具有在网站上执行操作的功能,例如发布内容、评论、编辑等。我在想办法限制每天的操作次数以防止垃圾邮件,而不是陷入烦人的状态与日期时间相关的东西我决定只将数据存储到缓存(memcached)中,为此创建一个功能。

编辑:找到解决方案:

我正在使用旧的实现,每天缓存帖子的数量,并将一天设置为超时。但是还有一个 celery 异步 cron 作业,它每天检查和擦除一次选定的缓存键。

所以我使用下面的原始代码,加上这个:

from django.core.cache import cache
from lib.cache_keys import daily_count_key
from django.contrib.auth.models import User

@periodic_task(run_every=crontab(hour='*/24')) # AKA run once a day
def wipeDailyLimits():
users = User.objects.all()
for user in users:
    cache.delete(daily_count_key("modelone", user))
    cache.delete(daily_count_key("modeltwo", user))
    cache.delete(daily_count_key("modelthree", user))

例子:

def post_entry(request):
   # post the entry
   daily_post_count = cache.get(request.user.id + "entrycount")

   if daily_post_count >= 5:
       return error

   if daily_post_count is None:
       daily_post_count  = 1

   if daily_post_count < 5:  # 5 posts per day
       daily_post_count += 1

   cache.set(request.user.id + "entrycount", daily_post_count , 86400)
                                               # Unix one day time out
   # return regular

到目前为止,这个策略看起来不错,一切正常,但我想知道用户是否可以使用任何漏洞或技巧来破坏这个系统?如果是这样,大多数人如何处理 django 的限制?

谢谢

4

3 回答 3

1

两件事情;

  • 如果用户一次发布多个帖子,他们可能会通过,因为多个进程可以读取计数,都增加他们的 daily_post_count 并且都存储旧值 + 1(如果它们相互运行,它们会存储旧值+ 2 最后)不太可能成为问题。

  • 您的计数不会完全按照您的意愿重置,因为您每次保存帖子时总是重置超时。如果我发一个帖子,然后 23 小时后又发一个,然后 23 小时后又发一个,计数将是 3,但 46 小时会过去。将计数器设置为 0 的唯一方法是等待 24 小时不发布,否则它永远不会减少。如果他们应该能够发帖却不能发帖,很可能会惹恼用户:)

于 2012-10-06T08:57:04.390 回答
1

我建议使用不同的方法。您当前的方法意味着即使在非垃圾邮件之后,用户也不知道他的帖子是否被传达。相反,如果您想限制,在呈现页面/站点之前,添加中间件来执行count()您想要约束的任何操作,并向您的HTTPResponsethat states添加一个标志daily_limt_exceeeded=True。这样,您可以显示适当的基于标志的警告消息,并在达到限制后禁止用户发布。

如果您愿意,可以使用Django 评论框架在您的网站上发表评论,它带有一些垃圾邮件保护:

评论表的注意事项

评论系统使用的表单具有一些您应该了解的重要反垃圾邮件属性:它包含许多隐藏字段,其中包含时间戳、有关评论应附加到的对象的信息以及用于验证此信息。如果有人篡改了这些数据——评论垃圾邮件发送者会尝试——评论提交将失败。如果您要呈现自定义评论表单,则需要确保将这些值原封不动地传递。时间戳用于确保“回复攻击”不会持续很长时间。在请求表单和发表评论之间等待太久的用户将被拒绝提交。

评论表单包括一个“蜜罐”字段。这是一个陷阱:如果在该字段中输入了任何数据,评论将被视为垃圾邮件(垃圾邮件发送者通常会自动填写所有字段以尝试进行有效提交)。

默认表单用一段 CSS 隐藏这个字段,并用警告字段进一步标记它;如果您将评论表单与自定义模板一起使用,您应该确保这样做。评论应用程序还依赖于 Django 附带的更通用的跨站点请求伪造保护。如文档中所述,最好使用 CsrfViewMiddleware。但是,如果您不使用它,则需要在包含评论表单的任何视图上使用 csrf_protect 装饰器,以便这些视图能够输出 CSRF 令牌和 cookie。

于 2012-10-06T09:44:23.683 回答
0

找到了一个具有双方优势但更易于实施的解决方案。我正在使用旧的实现,每天缓存帖子的数量,并将一天设置为超时。但是还有一个 celery 异步 cron 作业,它每天检查和擦除一次选定的缓存键。

用户会知道他们受到了限制,因为只是将变量传递到模板中。

无论如何感谢你们的帮助!

于 2012-10-07T02:04:29.647 回答