【问题标题】:How to handle One-Time User interaction [closed]如何处理一次性用户交互 [关闭]
【发布时间】:2011-12-20 21:43:03
【问题描述】:

我正在研究一个由 域模型(在其单独的项目中)和 MVC3 Web 应用程序(同样在其自己的项目中)组成的解决方案。 p>

在我的 MVC3 应用程序中,我列出了帖子(通过域上的存储库访问),每个帖子都有一个 like 按钮,当然在域中模型,Post 实体有一个属性:

public int Likes { get; set; }

我希望允许我网站的访问者(即访客)能够点击帖子上的“赞”按钮,但只能点击一次。这样他/她就能够点赞一个帖子一次

实现这一目标的最佳方法是什么?饼干 ?将 IP 地址与喜欢的帖子 ID 一起保存在数据库中?还是其他方式?

我真的很困惑,因为无论我怎么想,逻辑中总是存在漏洞,用户可以两次赞一个帖子!

任何帮助都会很棒。

谢谢。

【问题讨论】:

  • 这就是在互联网上匿名的全部意义所在。用户可以从不同的 IP 访问您的应用程序,他们绝对可以清除他们的 cookie。如果你真的想确定没有人喜欢某样东西两次,他们就需要进行身份验证。
  • 非常感谢大卫。在这两者中,Cookie 与 IP 节省..如果您处于我的情况,您会做哪一个?
  • 只选择一个,我会在服务器端加密一个值(如 GUID 或其他东西),并将其存储在 cookie 中。这样,我可以跟踪不定期清除 cookie 的用户并且客户端无法修改该值。他们只能删除它。
  • 谢谢大卫。该加密值 (GUID) 代表什么?

标签: asp.net-mvc-3 ef-code-first


【解决方案1】:

在此问答中获得战利品:https://softwareengineering.stackexchange.com/questions/94095/how-to-prevent-same-user-rating-a-web-content-like-video-more-than-once

底线:没有办法绝对防止多票,但你可以通过足够的开发努力部分降低风险。

【讨论】:

  • 谢谢你。那是一本有趣的书。在我清楚大卫的话之后,我想我会接受大卫的建议:)
【解决方案2】:

加密的 cookie 只能以他们无法修改的方式代表唯一用户(但是,他们可以删除)

public ActionResult Like()
{
    var cookie = Request.Cookies["SecureCookieName"].Value;
    if(!string.IsNullOrEmpty(cookie))
    {
        string plainTextGuid = Decrypt(cookie);
        if(_db.Likes.Any(l => l.UniqueID == plainTextGuid))
            return null;
    }

    // if you're here, this is a "new" user
    Guid guid = new Guid();

    // TODO: persist Like to database including unencrypted guid.ToString()

    // set cookie value to encrypted
    Request.Cookies["SecureCookieName"].Value = Encrypt(guid.ToString());

    // or whatever logic you need
    return null; 
}

EncryptDecrypt 方法可以包括您选择的加密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多