【问题标题】:mongoose/mongodb deal with spamming like/unlike button and updatingmongoose/mongodb 处理垃圾邮件喜欢/不喜欢按钮和更新
【发布时间】:2020-04-29 02:55:27
【问题描述】:

因此,每当用户向喜欢/不喜欢按钮发送垃圾邮件时,对数据库的更新都会以一种奇怪的方式进行。例如:

  • 如果用户慢慢按点赞和不喜欢,帖子的点赞数会正常更新:不喜欢的帖子有 0 个赞,喜欢的帖子有 1 个赞
  • 如果用户多次快速按赞和不赞,帖子的赞会以一种奇怪的方式更新:帖子有 0 个赞,如果不赞,然后突然有 2 个赞。

我相信这可能与 mongoose 更新数据库的异步特性有关。

script.js:

$('.card-body').on('click', '#like-btn', function() {

    //unlike button is similar except that it requests /unlikePost
    $.get('/likePost', {username: username, postId: postId}, (data) => {});
}) 

我正在考虑将 ajax 调用包裹在 timeout 周围,但我不确定这是否是最佳做法。

数据库调用:

likePost: function(postId, username) {
    database.updateOne(Post, {_id: postId}, {$inc: {numberOfLikes: 1}}, (flag) => {

    })
    database.updateOne(User, {username: username}, {$addToSet: {likedPosts: postId}}, (userFlag) => {
        console.log(userFlag)
    })
},

unlikePost: function(postId, username) {
    database.updateOne(Post, {_id: postId}, {$inc: {numberOfLikes: -1}}, (flag) => {

    })
    database.updateOne(User, {username: username}, {$pull: {likedPosts: postId}}, (userFlag) => {
        console.log(userFlag)
    })
},

【问题讨论】:

    标签: javascript jquery mongodb express mongoose


    【解决方案1】:

    最简单的解决方案是在单击 UI 时禁用该按钮,然后执行更新,然后再次启用该按钮。这将使您的系统在普通用户使用时正常运行(他们将无法单击禁用的按钮)。

    要让系统在面对确定的攻击者时能够正常运行,您需要跟踪谁在服务器端投票,并且每个用户/IP/任何人只允许投一票,不允许在没有事先投票的情况下投票等。在这种情况下,攻击者可以直接向您的应用程序发出 API 请求,而您在前端所做的事情是无关紧要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 2012-09-20
      • 1970-01-01
      • 2014-09-21
      • 2019-07-03
      • 2017-09-06
      • 2019-11-27
      • 1970-01-01
      相关资源
      最近更新 更多