如何防止用户多次发帖?

时间:2017-02-05 11:00:27

标签: ios swift firebase firebase-realtime-database

我有一个应用程序,用户只能每五分钟发一次帖子。

我正在试图找出防止用户在这五分钟内多次发布的最安全方法。

我提出的第一个解决方案是对用户发帖后更新的lastPostTimestamp值进行检查。

我发现这个问题的可能性是,如果某人的互联网速度非常缓慢或滞后,用户可能只是在Firebase上更新时间戳之前两次垃圾邮件按钮并获得两个帖子。

然后路由是创建局部变量和定时器设置为5分钟并检查firebase和局部变量,但是如果它存在,则检查本地和firebase(如果存在),这一切似乎都很混乱和奇怪。

我无法使用UserDefaults用户切换设备。

有关如何顺利检查以确保用户在过去5分钟内未向Firebase发送信息的任何想法?

6 个答案:

答案 0 :(得分:0)

处理此问题的一种方法是在第一次激活按钮后禁用该按钮,并且在用户再次发布之前不要重新激活该按钮。

答案 1 :(得分:0)

我会使用时间戳检查(服务器端)的组合,并在单击(本地)时禁用该按钮。

可以通过再次启动应用程序来重新激活该按钮,但确实可以阻止按钮发送垃圾邮件(您的连接速度缓慢)。

时间戳会阻止重新打开应用并再次发布。

答案 2 :(得分:0)

我认为最安全的方法可以防止与您类似的时间问题,检查服务器端。如果您在客户端进行检查,如果您没有在服务器端进行检查,则表示您的应用存在漏洞。因为用户可以更改手机的本地时间。所以他/她可以操纵你的服务。因此,我建议您始终检查服务器端的时间操作对您的应用程序更安全。

答案 3 :(得分:0)

听起来您可以使用交易来阻止竞争条件利用和数据库级安全规则来强制执行时间限制。但是,它不适用于.push()和自动ID(不知道你是否使用它们,如果你这样做,你可能需要重写你的客户端以开始使用顺序帖子ID)。

使用事务块避免Firebase中的竞争条件

您的客户端应用会根据上一个已知的帖子ID按顺序生成新帖子的路径。然后在事务块中,您将检查该路径上的帖子是否已经存在,如果存在则中止。

Pseudocode 可能会在以后重写Swift / iOS SDK,但你明白了

let post = new Post("/path/to/posts/\(lastPostId + 1)")

post.transaction(function (currentPostData) {
  if (currentPostData !== null) { return }
  ...
})

然后,如果用户快速提交两次,在一种情况下,事务处理程序将不得不返回任何内容并失败。

另见

使用数据库安全规则实施时间限制

您可以提交上一篇文章ID以及新帖子,然后使用Firebase实时数据库规则检查上一篇文章的时间戳是否足够老。

{
  "rules": {
    "posts": {
      "$post_id": {
        ".write": "(now - 300000) > root.child('posts').child(data.lastPostId).child('timestamp').val()"
      }
    }
  }
}

如果您可以在规则字符串本身中获取最后一个帖子的时间戳,那会更好,但我现在没有看到这样做的方法。

如果您也可以使用规则来避免竞争条件利用,那就更好了,但似乎规则语言太有限了,不允许这样做。

另见

答案 4 :(得分:0)

因为你有上一篇文章的lastPostTimestamp值。我会说用户的最后一篇文章的观察者然后:

onPress

答案 5 :(得分:0)

我认为,这应该在服务器端处理。

使用帖子的唯一ID很简单。

用户发布时:

  1. 检查它是否已经发布?
  2. 如果是,则进行更新
  3. 否则,将其插入为新内容。