在查看我们的登录系统以添加一些新功能后,我发现它不是很安全。 auth cookie 是对 user id, stamp, version, PASSWORD IN THE RAW, and a cookie id
的加密 至少我可以说我不是那样做的,以前的开发人员是这样做的. (是的,我知道密码应该在数据库中保存为哈希而不是纯文本。原始开发人员是这样做的,我还没有修复它。)
因此,我在这里和网络上阅读了大量关于安全登录和安全 cookie 的资料。我可以看到不安全地做这件事是多么容易。
关于网站
- 这是一个电子商务网站,也有很多社区内容(留言板、图库)
- 登录页面强制使用 HTTPS
- 所有帐户页面和结帐也都强制使用 HTTPS
- 需要当前密码才能更改密码或电子邮件地址
这是我的计划:
目标:
- 能够在多个地方登录
- 商店的安全部分需要重新登录,仅持续 30-60 分钟,仅 cookie 设置安全
- 查看所有当前登录的选项
- 选择在所有地方注销
后端登录是安全的,并且持续时间更长。办公室外的有限登录
user gets page: no auth: have user sign in with username & pass create new token expires = https on store: 30-60 min backend in office: 5 days backend remote: 30-60 min? regular without remember me: session or 24 hours? regular with remember me: 30 days insert into user_session set cookie auth: token in db: set uid generate new token, new expires, insert into DB, remove old? upddate cookie token not in db: logout, requre sign in table user_session: uid uid_as (for being 'logged in' as another user, admin feature only) token type ip address expires stamp cookie value: token|hash(token + user id, server key)
根据我所阅读的所有内容,这就是我想出的。我确实觉得我错过了一些东西。除了对整个站点使用 HTTPS 之外,我的计划或使其更安全的方法是否有任何问题? (它目前会导致一些问题,但我稍后会研究这个)
最佳答案
听起来像是向前迈出了一大步 - 您的 cookie 值仍然可以被其他用户劫持,特别是如果用户没有注销
(破坏有关 session 的数据库信息)。只是需要注意的事情。
如果您想一次支持多次登录,您需要考虑对所有人使用相同的 token (糟糕的计划)或每个 session 使用唯一的 token 。在后一种情况下,您需要将 session 绑定(bind)到一个 IP - 这也会降低从另一台计算机欺骗 token 的能力。
对于关键交易(如果有的话),您还可以要求用户重新确认他们的密码(通过 HTTPS)。
关于php - 这个登录系统足够安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3728642/