Skip to content

修复邮箱验证链接安全问题 - #676

Open
hans362 wants to merge 4 commits into
bs-community:devfrom
hans362:fix-email-verification-link
Open

修复邮箱验证链接安全问题#676
hans362 wants to merge 4 commits into
bs-community:devfrom
hans362:fix-email-verification-link

Conversation

@hans362

@hans362 hans362 commented Jan 26, 2026

Copy link
Copy Markdown

@shhzhang 发现当前邮箱验证链接存在以下安全问题:

  1. 验证链接永不过期
  2. 验证链接仅对用户ID进行了签名

其中问题2比较严重,如果用户在收到验证链接后故意不完成验证,又把邮箱改成其他任意邮箱,之前收到的验证链接仍然能继续使用,从而可以绑定任意邮箱。

#675 的修复似乎仅在签名中增加了时间戳,只解决了问题1,且修复方式较为复杂,本 PR 使用 temporarySignedRoute 进行修复。

@shhzhang

Copy link
Copy Markdown

#675 是我应急修复漏洞,用AI跑的。对目前正式版皮肤站验证链接逻辑进行分析,可以发现,其【重置密码】业务和【验证邮箱】业务发出的验证链接是不同格式的。
【重置密码】业务的验证链接具有有效期时间戳,过期就会失效,链接由于算法问题,不是一成不变的。
【验证邮箱】业务的验证链接是终身不变的。

我们的背景情况是学生社团,实名游玩,高校联合,因此这个漏洞对我们来说可以说是致命的。

#675 中增加了一个强制验证机制,所有的签名链接都要写在数据库users表里面,一次一用。又改变了链接的算法,把生成链接的时间戳也纳入到了生成算法中,这样保证了每次生成的链接都不与上次的一致。但是这样修理又出现了几个问题,一是修复太复杂;二是写坏了Auth,致使基于eduroam的登陆页面会失效;三是无法在PHP82-83上跑通测试。

实在是没办法了,我们缺少技术人员,遇到这种问题只能先写个石山顶一下了。还得大佬们出山Orz。给大家添麻烦了。

@tnqzh123 tnqzh123 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

考虑使用 SHA256 而不是 SHA1?PHP 的 hash 就能生成 SHA256 Hash

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants