【问题标题】:Username/Password Database Checking用户名/密码数据库检查
【发布时间】:2010-12-12 17:14:49
【问题描述】:

如何改进此用户名/密码检查?

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Login(FormCollection collection)
    {
        var users =
            (from p in _dataContext.Users
            where p.Name == collection["Username"] && p.Password == collection["Password"]
             select p);

        if (users.Count() > 0)
        {
            // Login Succeed
            // To get the username I should do something like users.First().Name
            // and that's really bad...

            return RedirectToAction("Login");
        }
        else
        {
            // Login Faild
            return View();
        }
    }

【问题讨论】:

    标签: c# linq linq-to-sql authentication


    【解决方案1】:

    你考虑过微软的Membership API吗?它以安全的方式为您处理用户名和密码的所有详细信息。此外,您似乎计划以明文形式存储密码,这是密码学领域的cardinal sin

    【讨论】:

      【解决方案2】:
      1. 使用 asp.net 会员模式,不要重新发明轮子。
      2. 如果您真的想重新发明轮子,则需要加盐和散列密码。只存储密码+盐的哈希值。这是最低限度的。

      【讨论】:

        【解决方案3】:

        我假设该查询只能有一个结果。如果是这样,你应该使用SingleOrDefault

        var user = _dataContext.Users.SingleOrDefault(p =>
                          p.Name == collection["Username"]
                          && p.Password == collection["Password"]);
        
        if(user != null)
        {
            // Go on...
            return RedirectToAction("Login");
        }
        else
        {
            // Login Faild
            return View();
        

        }

        正如其他人指出的那样,您应该在该代码中解决其他问题(即,不存储纯文本密码而是存储哈希)。

        【讨论】:

        • 我真的没想到这是公认的答案。不要忘记做哈希的事情。加盐。你真的应该。
        • @Martinho - 对我来说很有意义。很多人听到“Membership API”并认为“哦,不,另一个笨拙的框架”。我知道我第一次看到它时就做到了。只有当一个现有的应用程序迫使我使用它时,我才意识到它的优点。您回答了@Alon 提出的问题。
        【解决方案4】:

        假设您的“用户名”字段保证是唯一的(即主键),只需选择用户并比较密码字段。

        此外,您通常不应将原始密码存储在数据库中。相反,支持 MD5 哈希或其他东西(也许使用用户名作为盐)。然后将用户输入的哈希值与数据库中的值进行比较,而不是比较原始值。

        【讨论】:

        • MD5 有一些弱点,不再推荐使用。我会推荐 SHA1 或 SHA2。
        【解决方案5】:

        就像大多数人提到的那样,要么使用已经提供的 Membership API,要么以某种安全的方式加密密码。此外,如果您决定不走这条路并选择加密密码,请确保使用您知道有效的已建立加密库。

        如果操作不当,重新发明加密算法可能会出现危险的缺陷(更不用说浪费时间了,因为不会增加任何价值)。如果密码泄露,那么不仅有人可以利用您的网站,还可能利用许多其他网站,因为人们倾向于使用相同的用户名和密码。

        最后,在 .Net 命令行中使用 aspnet_regsql.exe 为数据库配置成员资格 API 的架构。从字面上看,配置数据库和切换 web.config 只需不到 5 分钟。

        【讨论】:

        • 使用双向加密存储密码也不是一个好主意。单向算法(散列)更安全。
        • 是的。作为一般规则,如果您不需要知道该值,请对其进行哈希处理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 2013-11-25
        • 2012-08-29
        • 1970-01-01
        • 2014-04-02
        • 2017-11-29
        相关资源
        最近更新 更多