admin 发表于 2020-12-3 09:11:19

Discuz登陆原理解析

DiscuzX 登录原理
DiscuzX 中记录登录信息的两个关键 cookie 是 saltkey 和 auth,只要这两个值不被改变,那么这个会话就被视为已登录,具体请参考 upload/source/function/function_core.php:153 中 authcode 函数的加解密算法,upload/source/function/function_member.php:81 和 upload/source/class/discuz/discuz_application.php:454 处的调用。

解码的大致流程:由全局的 authkey 和 saltkey 生成一个会话的 authkey。使用这个 authkey 解码 auth 得到 password 和 uid,判断 uid 的密码是否等于 password。

由此可见只要这两个 cookie 相同,那么就会被视为已登录。可以尝试点击退出登录,然后在把 cookie 复原,这个授权是永久的,除非改变全局 authkey。

每次登录的随机产生的 saltkey 不同,所以 auth 是不一样的,如果同一个用户对应了两个 auth,那么很明显,他重复登录了。

如果首次打开网站,cookie 中还没有 saltkey 那么会随机生成一个与 microtime() 有关的 8 字节的字符串,作为 saltkey。

由于这种“永久性登录授权”,导致我们没法彻底登出,防君子不防小人,具体我们就不再讨论。

注意:这里所说的 password 是 pre_common_member 表中的 password 字段,它与用户的密码毫无关联,只是一个 token 一样的东西,通过 md5(random(10)) 生成(具体参考 upload/source/class/class_member.php:728),真正的密码储存在 pre_ucenter_members 中,这个 password 会在用户重置密码时重新生成,所以如果重新这个字段可以达到取消“永久性登录授权”的目的。

页: [1]
查看完整版本: Discuz登陆原理解析