我正在为我正在建设的网站编写登录系统 以下是我如何实现登录系统的本质:
我有两个表:用户和会话。
users: uid | uname | pass
sessions: sid | uid | ts | ts_expires
因此用户输入uname / pass组合。
sid
)sessions
,将该sid与所提供用户名的uid相关联。sid
的Cookie,其中包含刚刚插入sid
的随机sessions
的值。在需要用户登录的每个页面上,我检查:
所以我的问题是:
PS:我还没有使用SSL安全登录。所以这是我发现的唯一问题,截至目前。哦,我使用php和mysql,如果这是相关的。
编辑:我的密码不是以明文形式存储,而是存储在与密码连接的用户名的MD5中。
所以,pass = MD5($uname.$pass)
,可以这么说。
答案 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可能导致后续用户通过被放弃的会话获得访问权。