我正在为一个新的 PHP 站点开发一个登录和身份验证系统,并且一直在阅读各种攻击和漏洞。但是,它有点令人困惑,所以我想检查一下我的方法是否有意义。
我计划存储以下数据:
在 session 中:用户 ID,散列 + 加盐
HTTP_USER_AGENT
在 cookie 和数据库中:随机标记,散列 + 加盐标识符
在每个页面上,我计划执行以下操作:
如果 session 存在,则使用该 session 进行身份验证。检查
HTTP_USER_AGENT
是否与存储的 session 中的匹配。如果不存在 session ,则使用 cookie 进行身份验证。检查 cookie 中的 token 和标识符是否与数据库中的匹配。
如果 cookie 无效或不存在,则要求用户登录。
这有什么明显的缺陷吗?只要我在 cookie 中设置超时,我应该是相当安全的,对吧?有什么我想念的吗?
非常感谢。
最佳答案
一些随意的想法:
- 如果我窃取了您的一位用户的 cookie(通过在您的网站中注入(inject)一些 JS 代码来使用 XSS 攻击)怎么办?然后我会遇到情况 2。因此能够登录。恕我直言,如果您想要真正安全的身份验证,请不要使用“记住我”类型的 cookie 来存储用户凭据。
- 如果您将凭据存储在 cookie 中,请不要以明文形式存储密码。
- 检查
HTTP_USER_AGENT
是防止 session 劫持的良好开端,但也许您可以将它与 IP 地址结合起来?与您的目标位于同一台主机上比简单地使用相同的浏览器要困难得多。
但无论如何,感谢您花时间思考一个好的身份验证方案。许多 PHP 开发人员不知道。
编辑:作为记录,让我在这里澄清一点:本次讨论中有两个 cookie。一个由 PHP 自动设置以传播 session ID(有时,我们看到网站将其放在 URL 中,例如 www.example.com/page.php?sessionId=[...]),第二个由您创建为了存储用户凭据并在 session 丢失时对其进行身份验证。 XSS 攻击适用于两者,即攻击者可以窃取 session cookie 并劫持 session (具有有限的生命周期),或者窃取凭据 cookie 并在以后进行身份验证。
关于php - 开发安全的 PHP 登录和身份验证策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917391/