2017-02-05 132 views
0

我有一个应用程序,用户只允许做后每五分钟一次。如何防止用户多次发帖?

我想弄清楚如何最安全的方式来防止用户在这五分钟内超过一次发布。

我想出的第一个解决方案是对用户发布帖子时更新的lastPostTimestamp值执行检查。

我发现了这个潜在的是,如果一个人的互联网是惊人的慢或laggy,用户可能只是垃圾邮件按钮时间戳更新火力地堡前两次,得到两个职位的问题。

路线然后是创建本地变量和定时器设置为5分钟,同时检查火力和局部变量,但只是一切似乎混乱和怪异要检查两个地方,如果它存在和火力点,如果它的存在。

柜面用户切换设备我不能使用UserDefaults。

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

回答

0

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

0

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

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

时间戳防止重新打开应用程序,并再次发布。

0

我认为最安全的方式,以防止时间问题,这是与你相似,在服务器端检查。如果你在客户端检查它,并且如果你没有在服务器端检查,这意味着你的应用程序有一个漏洞。因为用户可以更改手机的本地时间。所以他/她可以操纵你的服务。因此,我建议你应该经常检查服务器端的时间操作是否对你的应用程序更安全。

0

听起来像是你可以使用交易阻止竞争条件开发和DB级别的安全规则强制执行时间限制。但是,它不会与.push()和自动标识(不知道,如果你使用的,如果你这样做,你可能需要重写你的客户开始使用顺序后的ID)工作。在火力地堡

避免竞争条件与交易模块

你的客户端应用程序会产生依次新岗位的路径,基于最后已知的帖子ID。然后在交易区块中,您将检查该路径中的帖子是否已经存在,如果存在则放弃。

以后可能会用斯威夫特/ 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()" 
     } 
    } 
    } 
} 

它会更好,如果你能获取的规则字符串本身帖子的最后的时间戳,但我看不出这样做,现在的方式。

如果你还可以使用规则来避免竞争条件的利用,那会更好,但是看起来规则语言太有限了。

0

见有您的最后一个职位的lastPostTimestamp值。我会说,用户的最后一篇文章观察员然后:

 let time = lastPostTimestamp 
     let datum = Date(timeIntervalSince1970: time as! TimeInterval) 
     let seconds = Date().timeIntervalSince(datum as Date) 

     guard seconds > 300 else {return} // 5 minutes 

     button.isEnabled = true