如何实现Web应用程序的登录系统?

时间:2010-01-06 17:49:10

标签: login

我正在为我正在建设的网站编写登录系统 以下是我如何实现登录系统的本质:

我有两个表:用户和会话。

   users: uid | uname | pass
sessions: sid | uid | ts | ts_expires

因此用户输入uname / pass组合。

  • 如果组合不正确,我会重定向到“错误的身份验证”页面。
  • 如果组合正确,我:
    • 生成随机会话ID(sid
    • 将记录插入sessions,将该sid与所提供用户名的uid相关联。
    • 设置一个名为sid的Cookie,其中包含刚刚插入sid的随机sessions的值。

在需要用户登录的每个页面上,我检查:

  • 是否设置了Cookie
  • 如果sid有效

所以我的问题是:

  • 这种机制可能存在哪些潜在问题?
  • 如何实施良好的登录系统?

PS:我还没有使用SSL安全登录。所以这是我发现的唯一问题,截至目前。哦,我使用php和mysql,如果这是相关的。


编辑:我的密码不是以明文形式存储,而是存储在与密码连接的用户名的MD5中。

所以,pass = MD5($uname.$pass),可以这么说。

4 个答案:

答案 0 :(得分:17)

用盐来哈希那个密码!使用像bcrypt这样的强哈希。如果你必须使用MD5 / SHA使用一种称为拉伸和哈希的技术,它的哈希数千次。用户不会在意它是否需要一秒钟来检查他/她的密码而不是1/1000,而是一个蛮力的破解者。

记录尝试并防止强力尝试。

在登录后要非常谨慎地存储用户凭据的位置。您不希望他们更改它。

并使用SSL!

答案 1 :(得分:3)

为了减缓蛮力攻击,在尝试失败后进行强制延迟;也就是说,如果有人给你错误的密码,请在显示“密码失败”的下一个屏幕前等待三秒钟。

答案 2 :(得分:3)

设计和实现安全,强大,可用的登录系统实际上很难在第一次尝试时正确。页面上的页面已经写过关于这个主题的内容 - 这里的内容非常广泛,无法正确对待。

一个很好的起点是www.owasp.org。然后聘请与您合作的人,了解安全性,与安全公司签订合同(例如www.matasano.com,veracode.com或neohapsis.com - 我已与三家公司合作,三者都非常好) ,和/或在安全邮件列表上提问(例如securityfocus.com上列出的Web应用程序安全列表)。

答案 3 :(得分:1)

将密码存储为实际密码的盐渍单向哈希,而不是将其存储为明文,这通常是一种很好的做法。你没有说明你是否这样做,但如果不这样做,那就去做吧。

确保登录时间超时,因此不会永久持续。

确保在注销时删除cookie。

不要忘记用户可能正在从公共计算机登录,并且将登录凭据存储为cookie可能导致后续用户通过被放弃的会话获得访问权。