使用PHP自动登录安全性,如何以及为什么

kei*_*hmj 10 php security

我知道这个问题已被多次询问过,但我对它有一点不同的看法.这是一个两部分问题.

首先,我正在实现自动登录,我想知道我的工作流程中有哪些漏洞.

其次,我不清楚黑客如何使用他们窃取的信息来破坏系统.


第一部分,这是我的工作流程,哪些部分容易受到攻击.以下是一些可能或可能没有帮助的事情,我使用的是PHP 5.6.21.我将使用他们的新哈希API,它使用最新的哈希技术并自动加盐.我正在使用MVC架构,因此除了我的前端控制器和个人资产之外,几乎所有东西都在Web服务器的根目录之外.

  1. 会员登录并选择自动登录复选框

  2. 具有哈希值的cookie与成员表中的哈希值匹配,将写入其浏览器.cookie只能从服务器上的成员目录访问,该目录位于根目录之外.此外,还设置了httpOnly属性.

  3. 成员下次登录时,会检查该cookie是否存在,如果是,则使用散列值作为键来查找成员表中的成员.

  4. 如果找到它们,请将它们登录.如果设置了cookie,但未找到匹配的记录,那么cookie可能会被篡改.在这种情况下,在数据库中创建一个新的自动登录哈希并删除成员浏览器中的cookie.然后,强制他们手动登录.如果他们再次选择自动登录,则会返回步骤1,这次使用新哈希.

因此,它非常简单,没有用户数据存储在cookie中,只是一个毫无意义的哈希.


我的问题的第二部分更为笼统.假设黑客以某种方式破坏了自动登录cookie并获取了密码.他们能用它做什么?他们如何使用它来破坏我的系统?

在SQL注入的情况下,我理解数据转储是可能的,黑客可以获得数据库的只读视图.在这种情况下,必须使用哈希和盐渍密码!他们可以通过邪恶的机器运行这些哈希值,并可能获得您的登录凭据.

我正在阅读一些安全文件,说明采取所有这些措施的重要性.它一直说如果黑客可以访问你的数据库...但是,如果黑客可以访问你的数据库(具有写权限),这一切都不重要,因为无论你的哈希有多强大,你都会被搞砸.

谢谢你的时间!

Sco*_*ski 7

这有两个部分:

  1. 确保您的会话安全.阅读本文以获得有关会话安全性的入门知识,以及配置示例 Spoiler:HTTPS是必需的,确保您使用CSPRNG作为会话标识符,并且您在权限提升期间(和/或定期)重新生成会话ID.
  2. 安全地实施基于cookie的身份验证令牌,当用户使用有效的cookie但没有活动会话访问您的网站时,该令牌将透明地重新验证用户身份.我以前写过广泛的邻接通道抗性持久用户身份验证.

第二部分更有趣,因为许多人停止"生成随机令牌,存储在cookie中,然后在数据库中查找"步骤.

您可以安全地假设您的高度优化的数据库查询不是在恒定时间内比较字符串,就像您需要为了防止时间攻击一样.

解决方案是将您的令牌分成两部分:一部分用于数据库查找(定时泄漏),另一部分用于在恒定时间内进行比较.

  • 第一部分(称为选择器)存储/索引在数据库表中.
  • 第二个(称为验证程序)部分以明文形式存储在用户的cookie中,但在数据库中进行哈希处理(例如SHA256).

在基于选择器检索令牌之后,使用hash_equals()将用户提供的验证器的哈希值与存储的哈希值进行比较.

每个长期身份验证令牌只能使用一次.之后,应该向最终用户发出替换.注销应该清除cookie,而会话应该在浏览器关闭时到期.

只有在您使用HTTPS和HSTS时,这才是安全的,并且您的cookie设置为仅限HTTPS!(这意味着secure并且httpOnly都设置为true.)

您可以在此处和此处查看此系统的示例.