实现Passkey登录时如何防范用户枚举攻击?
确实,你描述的这种两步式Passkey登录流程存在用户枚举攻击的风险——攻击者可以通过输入不同用户ID后页面的差异,批量判断哪些账号是已注册且启用了Passkey的,进而针对有效账号发起后续攻击。以下是几种实用的防范手段:
统一第一步的反馈信息
不管输入的用户ID是否有效,前端都返回完全相同的提示内容,比如“请查看你的设备或邮箱,按照指引完成登录”。后台逻辑区分处理:如果是有效用户,触发Passkey验证请求或发送登录验证邮件;如果是无效用户,静默跳过后续操作,不返回任何差异提示。攻击者无法通过前端反馈判断用户ID是否存在。强制统一响应延迟
对所有第一步的用户ID校验请求,设置相同的响应延迟(比如1-2秒)。避免攻击者通过响应速度差异枚举账号——通常有效用户会触发后台数据库查询,响应速度可能比无效用户慢,统一延迟可以抹平这个差异。隐藏Passkey启用状态的前置提示
不要根据用户ID是否启用Passkey展示不同的第二步界面,而是统一显示包含所有登录选项的页面,比如“选择登录方式:Passkey验证 / 密码登录”。当用户主动选择Passkey后,后台再校验该账号是否启用了Passkey,若未启用再提示“该账号未设置Passkey,请切换至密码登录”。这种方式把差异延迟到用户主动操作后,避免攻击者直接通过第一步后的页面变化判断账号有效性。添加验证码与速率限制
在第一步输入用户ID时,引入验证码(如行为验证码),同时对同一IP地址的请求进行速率限制(比如1分钟内最多允许5次请求)。从源头减少攻击者批量测试用户ID的可能性。
这些方案可以组合使用,比如“统一反馈+速率限制”的组合,能大幅降低用户枚举攻击的风险。
内容的提问来源于stack exchange,提问作者Matthias Wimmer

