2017-02-05 55 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