Files
vue-driven-cloud-storage/CAPTCHA_README.md
喻勇祥 61c99ce5c0 添加登录验证码功能 - 增强系统安全性
## 新增功能
- 密码输错2次后自动显示验证码
- 4位数字验证码,点击可刷新
- 验证码有效期5分钟
- 基于IP和用户名双重防护
- 前台和后台登录均支持

## 后端改动
- 新增验证码生成API: GET /api/captcha
- 修改登录API支持验证码验证
- 添加session管理验证码
- 增强RateLimiter防爆破机制

## 前端改动
- 登录表单添加验证码输入框(条件显示)
- 验证码图片展示和刷新功能
- 自动触发验证码显示逻辑

## 依赖更新
- 新增: svg-captcha (验证码生成)
- 新增: express-session (session管理)

## 文档
- CAPTCHA_FEATURE.md - 详细功能文档
- CAPTCHA_README.md - 快速开始指南
- test_captcha.sh - 自动化测试脚本
- 更新说明_验证码功能.txt - 中文说明

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 16:32:32 +00:00

174 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 登录验证码功能 - 快速开始
## 功能说明
本次更新为"玩玩云"添加了登录验证码功能,提高系统安全性:
**自动触发**密码输错2次后自动显示验证码
**智能保护**基于IP和用户名双重维度防护
**易于使用**:点击图片即可刷新验证码
**前后通用**:前台用户和后台管理员登录均适用
## 安装依赖
已为后端安装以下依赖:
```bash
cd backend
npm install svg-captcha express-session
```
## 快速启动
### 1. 启动后端服务
```bash
cd backend
node server.js
```
### 2. 访问登录页面
打开浏览器访问:`http://localhost:40001`
### 3. 测试验证码功能
**方法1浏览器手动测试**
1. 输入任意用户名和错误密码
2. 点击"登录"按钮2次
3. 第3次尝试时会自动显示验证码输入框
4. 输入验证码后继续登录
**方法2使用测试脚本**
```bash
# 确保后端服务已启动
./test_captcha.sh
```
## 使用截图流程
### 第1-2次登录失败
![正常登录表单](screenshots/login_normal.png)
- 显示用户名和密码输入框
- 提示"用户名或密码错误"
### 第3次登录失败触发验证码
![验证码登录表单](screenshots/login_captcha.png)
- 自动显示验证码输入框
- 显示4位数字验证码图片
- 可点击图片刷新验证码
### 验证码验证
![验证码输入](screenshots/captcha_input.png)
- 输入图片中的4位数字
- 点击"登录"继续
## 配置说明
### 环境变量配置(可选)
`backend/.env` 文件中添加:
```env
# Session密钥建议生产环境修改
SESSION_SECRET=your-session-secret-here
# Cookie安全HTTPS环境启用
COOKIE_SECURE=false
```
### 调整验证码触发次数
编辑 `backend/server.js`,找到以下代码:
```javascript
// 第683行附近
const needCaptcha = ipFailures >= 2 || usernameFailures >= 2;
```
修改 `>= 2` 为你想要的次数(如 `>= 3` 表示第4次才需要验证码
### 调整防爆破参数
编辑 `backend/server.js`,找到以下代码:
```javascript
// 第394行附近
const loginLimiter = new RateLimiter({
maxAttempts: 5, // 最大失败次数
windowMs: 15 * 60 * 1000, // 15分钟
blockDuration: 30 * 60 * 1000 // 封锁30分钟
});
```
## 文件修改清单
### 后端文件
-`backend/server.js` - 添加验证码生成API和登录验证逻辑
-`backend/package.json` - 添加验证码依赖
### 前端文件
-`frontend/app.html` - 添加验证码输入框和图片显示
-`frontend/app.js` - 添加验证码逻辑和刷新方法
### 新增文件
-`CAPTCHA_FEATURE.md` - 详细功能说明文档
-`CAPTCHA_README.md` - 快速开始指南
-`test_captcha.sh` - 自动化测试脚本
## 功能特点
### 验证码特性
- **纯数字**只使用0-9数字易于识别
- **4位长度**:平衡安全性和用户体验
- **彩色显示**:提高可读性
- **点击刷新**:用户体验友好
- **5分钟有效期**:防止验证码被重复使用
### 安全机制
- **渐进式保护**
- 1-2次失败仅密码验证
- 3-5次失败要求验证码
- 5次失败封锁30分钟
- **双重维度**同时基于IP和用户名统计
- **Session存储**:验证码存储在服务器端,防止篡改
## 故障排查
### 验证码不显示
**检查项**
1. 确认后端服务已启动
2. 检查浏览器控制台是否有错误
3. 确认已输错密码至少2次
### 验证码一直错误
**检查项**
1. 确认输入的是图片中的数字
2. 刷新验证码重新尝试
3. 检查浏览器是否禁用Cookie
### API返回错误
**检查项**
1. 查看后端日志:`tail -f backend/logs/error.log`
2. 确认依赖已安装:`cd backend && npm list svg-captcha express-session`
3. 重启后端服务
## 测试清单
- [ ] 第1次登录失败不显示验证码
- [ ] 第2次登录失败不显示验证码
- [ ] 第3次登录失败显示验证码
- [ ] 验证码图片可以正常加载
- [ ] 点击验证码图片可以刷新
- [ ] 输入正确验证码和正确密码可以登录成功
- [ ] 输入错误验证码提示"验证码错误"
- [ ] 管理员登录也受到验证码保护
- [ ] 登录成功后验证码自动隐藏
## 技术支持
详细技术文档:[CAPTCHA_FEATURE.md](./CAPTCHA_FEATURE.md)
如有问题,请:
1. 查看后端日志
2. 检查浏览器控制台
3. 运行测试脚本 `./test_captcha.sh`
4. 查看详细文档