本应用实现了多层次的安全防护措施,保护用户数据和系统安全。
- 使用
bcryptjs对密码进行加盐哈希 - 默认使用 10 轮加盐(salt rounds = 10)
- 不存储明文密码
- 每个用户的密码使用唯一的盐值
- 使用 JSON Web Token (JWT) 进行身份验证
- 令牌有效期:7 天
- 令牌存储在 HttpOnly Cookie 中
Set-Cookie: auth-token=<token>; HttpOnly; Secure; SameSite=Strict; Path=/
- HttpOnly:防止 JavaScript 访问 Cookie,防范 XSS 攻击
- Secure:生产环境下仅通过 HTTPS 传输
- SameSite=Strict:防止 CSRF 攻击
- Path=/:限制 Cookie 作用域
- 用户名:3-20 字符,只允许字母、数字、下划线和中文
- 密码:6-50 字符
- 实时反馈验证错误
- 所有 API 端点都进行输入验证
- 使用
sanitizeInput函数清理用户输入 - 移除危险字符(
<、>) - 验证密码一致性(注册时)
- 输入清理:移除 HTML/JS 标签
- React 自动转义:防止脚本注入
- HttpOnly Cookie:防止令牌被盗取
- SameSite=Strict Cookie
- JWT 令牌验证
- POST 请求必需令牌
- bcrypt 哈希增加破解成本
- (建议:实现速率限制)
- 使用文件存储,避免 SQL 查询
- 输入验证和清理
data/users.json:用户数据(哈希密码).env.local:环境变量(JWT_SECRET)- 以上文件已添加到
.gitignore
- 生产环境使用 HTTPS
- 敏感数据(密码)仅在 POST 请求体中传输
POST /api/auth/register:用户注册POST /api/auth/login:用户登录POST /api/auth/verify:验证令牌POST /api/auth/logout:用户登出
- 不暴露敏感信息
- 通用错误消息(如"用户名或密码错误")
- 记录服务器端错误日志
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production-please生产环境:
- 使用强随机密钥(至少 32 字符)
- 不要使用默认密钥
- 定期更换密钥
生产环境中建议实施以下措施:
// 示例:使用 express-rate-limit
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分钟
max: 5 // 限制每个 IP 5 次请求
});- 注册/登录时添加验证码
- 防止自动化攻击
- 使用 TOTP 或短信验证码
- 提高账户安全性
- 记录恶意 IP
- 自动封禁
- 记录所有认证事件
- 监控异常行为
- 发送安全告警
- 依赖包安全扫描
- 代码安全审查
- 渗透测试
如果您发现任何安全漏洞,请通过以下方式报告:
- 发送邮件至:security@example.com
- 请勿公开披露漏洞