题目
设计安全的密码重置功能并防范漏洞
信息
- 类型:问答
- 难度:⭐⭐
考点
身份验证流程设计,安全漏洞防范,密码存储安全,输入验证
快速回答
安全密码重置的核心要点:
- 身份验证机制:使用时间敏感的加密令牌(而非可预测参数)
- 传输安全:全程强制HTTPS,重置链接设置短有效期(≤15分钟)
- 防信息泄露:统一化响应消息,避免暴露账户存在性
- 二次确认:关键操作前要求重新认证(如密码修改后强制重新登录)
- 密码策略:服务端强密码校验,使用bcrypt/Argon2存储
原理说明
密码重置是高风险操作,常见漏洞包括:
- 令牌劫持:可预测的reset_token参数导致账户接管(如使用自增ID)
- 中间人攻击:未使用HTTPS时令牌被窃取
- 账户枚举:差异响应暴露注册邮箱(如"邮箱未注册"提示)
- 会话固定:重置后未终止旧会话
代码示例(安全实现)
# 生成安全令牌(Python示例)
import secrets
from datetime import datetime, timedelta
def generate_reset_token():
return secrets.token_urlsafe(32) # 32字节加密强度随机数
# 存储令牌(服务端)
reset_tokens = {
"user@example.com": {
"token": generate_reset_token(),
"expiry": datetime.now() + timedelta(minutes=15)
}
}
# 验证令牌(服务端)
def validate_token(email, user_token):
record = reset_tokens.get(email)
if not record: return False
return secrets.compare_digest(record['token'], user_token) \
and datetime.now() < record['expiry']最佳实践
- 令牌设计:使用加密安全的随机数(如secrets.token_urlsafe),避免JWT等可解码结构
- 传输保护:链接中必须包含唯一标识(如用户ID哈希),防止并行攻击
- 操作限制:单令牌仅限使用一次,立即失效
- 审计日志:记录所有重置请求的IP、时间戳和元数据
常见错误
- 安全问答:使用弱安全问题(如"出生城市")易被社工破解
- 密码回显:重置页面通过URL参数传递新密码
- 长期有效:令牌过期时间超过1小时
- 客户端验证:仅依赖前端进行密码强度检查
扩展知识
- 速率限制:针对IP/账号实施请求限流(如1次/分钟)防暴力破解
- 多因素认证:高风险操作可要求短信/邮箱二次验证
- HSTS头:强制浏览器HTTPS访问,防范SSL剥离攻击
- 子资源完整性(SRI):防止第三方资源被篡改(如重置页面的CDN脚本)