用户登录并获得会话令牌。此令牌也存储在服务器上的数据库中。用户在每个请求中都包含此秘密令牌,服务器将从数据库中提取它以对用户进行身份验证。
这种方案很容易受到某人(可能是愤怒的 DBA)从 DB 中嗅出令牌并劫持用户会话的攻击。将会话令牌存储在内存中会增加嗅探密钥的难度,但这仍然不是不可能的。
安全存储会话令牌的普遍接受的方式是什么?
用户登录并获得会话令牌。此令牌也存储在服务器上的数据库中。用户在每个请求中都包含此秘密令牌,服务器将从数据库中提取它以对用户进行身份验证。
这种方案很容易受到某人(可能是愤怒的 DBA)从 DB 中嗅出令牌并劫持用户会话的攻击。将会话令牌存储在内存中会增加嗅探密钥的难度,但这仍然不是不可能的。
安全存储会话令牌的普遍接受的方式是什么?
我想说的是,在大多数情况下,通常认为一旦攻击者对您的系统具有 DBA 级别的访问权限,它就会受到攻击,因此减轻这种攻击更有可能通过策略/变更管理/活动监控等来完成。
如果您考虑一个愤怒的 DBA 可能对系统造成的损害,那么嗅探一个用户会话令牌可能远远低于规模......
愤怒的数据库管理员可能会在数据库提供的内容中注入 JavaScript,并对您的用户执行原始 XSS 攻击,这将使他能够从用户的浏览器中窃取会话标识符,从而使您在服务器上存储标识符的任何地方都一样好作为存储在数据库中。
所以你提出的方法并不是真的不安全,我只是更喜欢使用内置的会话管理,比如 PHP$_SESSION[]和 .Net 的Session[]。
我们哈希密码的原因是当攻击者可以访问数据库时(使用sql注入),那么他必须花费时间和资源来破解密码哈希才能有用。
将会话令牌存储在数据库中是一种快捷方式,您现在将身份验证凭据存储在可以立即使用的数据库中。就好像您以明文形式存储密码一样。
保存此数据时,密码重置令牌、会话标识符和密码都必须进行哈希处理。