代码之家  ›  专栏  ›  技术社区  ›  Alon Gubkin

用户名/密码数据库检查

  •  0
  • Alon Gubkin  · 技术社区  · 15 年前

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

        [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();
            }
        }
    
    5 回复  |  直到 15 年前
        1
  •  1
  •   R. Martinho Fernandes    15 年前

    我假设该查询只能有一个结果。如果是这样,您应该使用 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();
    

    }

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

        2
  •  9
  •   Community CDub    8 年前

    你考虑过微软的吗? Membership API ?它以安全的方式为您处理用户名和密码的所有细节。而且,看起来您计划将密码存储在clear中,这是一个 cardinal sin 在密码学领域。

        3
  •  2
  •   chris.w.mclean    15 年前
    1. 使用ASP.NET成员资格模型,不要重新发明轮子。
    2. 如果你真的想重新发明轮子,你需要加盐和散列密码。只存储密码+salt的哈希。这是纯粹的分钟。
        4
  •  0
  •   jheddings    15 年前

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

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

        5
  •  0
  •   jamesmillerio    15 年前

    正如大多数人提到的,要么使用已经提供的成员资格API,要么以某种安全的方式加密密码。此外,如果您决定不执行该路由并选择加密密码,请确保使用您知道有效的已建立的加密库。

    如果加密算法做得不好,那么对它们进行重新设计可能会有危险的缺陷(更不用说浪费时间,因为不会增加任何价值)。如果密码被泄露,不仅是你的网站有人可以利用,而且可能还有很多其他网站,因为人们倾向于使用相同的用户名和密码。

    最后,使用.NET命令行中的aspnet_regsql.exe为成员资格API配置带有架构的数据库。实际上,配置数据库和切换web.config不到5分钟。