Dev Team
|
78b64b50ab
|
fix: 全面修复系统级统一OSS配置的12个关键bug
## 修复内容
### 后端API修复(server.js)
- 添加oss_config_source字段到登录响应,用于前端判断OSS直连上传
- 修复6个API未检查系统级统一OSS配置的问题:
* upload-signature: 使用effectiveBucket支持系统配置
* upload-complete: 添加OSS配置安全检查
* oss-usage/oss-usage-full: 检查系统级配置
* switch-storage: 改进OSS配置检查逻辑
* 5个管理员API: storage-cache检查/重建/修复功能
### 存储客户端修复(storage.js)
- rename方法: 使用getBucket()支持系统级统一配置
- stat方法: 使用getBucket()替代user.oss_bucket
- 重命名操作: 改用DeleteObjectCommand替代DeleteObjectsCommand
* 修复阿里云OSS"Missing Some Required Arguments"错误
* 解决重命名后旧文件无法删除的问题
- put方法: 改用Buffer上传替代流式上传
* 避免AWS SDK的aws-chunked编码问题
* 提升阿里云OSS兼容性
- 添加阿里云OSS特定配置:
* disableNormalizeBucketName: true
* checksumValidation: false
### 存储缓存修复(utils/storage-cache.js)
- resetUsage方法: 改用直接SQL更新,绕过UserDB字段白名单限制
* 修复缓存重建失败的问题
- 3个方法改用ossClient.getBucket():
* validateAndFix
* checkIntegrity
* rebuildCache
- checkAllUsersIntegrity: 添加系统级配置检查
### 前端修复(app.js)
- 上传路由: 使用oss_config_source判断而非has_oss_config
- 下载/预览: 统一使用oss_config_source
- 确保系统级统一OSS用户可以直连上传/下载
### 安装脚本优化(install.sh)
- 清理并优化安装流程
## 影响范围
**关键修复:**
- ✅ 系统级统一OSS配置现在完全可用
- ✅ 文件重命名功能正常工作(旧文件会被正确删除)
- ✅ 存储使用量缓存正确显示和更新
- ✅ 所有管理员功能支持系统级统一OSS
- ✅ 上传完成API不再有安全漏洞
**修复的Bug数量:** 12个核心bug
**修改的文件:** 6个
**代码行数:** +154 -264
## 测试验证
- ✅ 用户2存储使用量: 143.79 MB(已重建缓存)
- ✅ 文件重命名: 旧文件正确删除
- ✅ 管理员功能: 缓存检查/重建/修复正常
- ✅ 上传功能: 直连OSS,缓存正确更新
- ✅ 多用户: 用户3已激活并可正常使用
|
2026-01-20 22:23:37 +08:00 |
|
Dev Team
|
53ca5e56e8
|
feat: 删除SFTP上传工具,修复OSS配置bug
主要变更:
- 删除管理员工具栏及上传工具相关功能(后端API + 前端UI)
- 删除upload-tool目录及相关文件
- 修复OSS配置测试连接bug(testUser缺少has_oss_config标志)
- 新增backend/utils加密和缓存工具模块
- 更新.gitignore排除测试报告文件
技术改进:
- 统一使用OSS存储,废弃SFTP上传方式
- 修复OSS配置保存和测试连接时的错误处理
- 完善代码库文件管理,排除临时报告文件
|
2026-01-20 20:41:18 +08:00 |
|
|
|
efaa2308eb
|
feat: 全面优化代码质量至 8.55/10 分
## 安全增强
- 添加 CSRF 防护机制(Double Submit Cookie 模式)
- 增强密码强度验证(8字符+两种字符类型)
- 添加 Session 密钥安全检查
- 修复 .htaccess 文件上传漏洞
- 统一使用 getSafeErrorMessage() 保护敏感错误信息
- 增强数据库原型污染防护
- 添加被封禁用户分享访问检查
## 功能修复
- 修复模态框点击外部关闭功能
- 修复 share.html 未定义方法调用
- 修复 verify.html 和 reset-password.html API 路径
- 修复数据库 SFTP->OSS 迁移逻辑
- 修复 OSS 未配置时的错误提示
- 添加文件夹名称长度限制
- 添加文件列表 API 路径验证
## UI/UX 改进
- 添加 6 个按钮加载状态(登录/注册/修改密码等)
- 将 15+ 处 alert() 替换为 Toast 通知
- 添加防重复提交机制(创建文件夹/分享)
- 优化 loadUserProfile 防抖调用
## 代码质量
- 消除 formatFileSize 重复定义
- 集中模块导入到文件顶部
- 添加 JSDoc 注释
- 创建路由拆分示例 (routes/)
## 测试套件
- 添加 boundary-tests.js (60 用例)
- 添加 network-concurrent-tests.js (33 用例)
- 添加 state-consistency-tests.js (38 用例)
- 添加 test_share.js 和 test_admin.js
## 文档和配置
- 新增 INSTALL_GUIDE.md 手动部署指南
- 新增 VERSION.txt 版本历史
- 完善 .env.example 配置说明
- 新增 docker-compose.yml
- 完善 nginx.conf.example
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 10:45:51 +08:00 |
|
|
|
ab7e08a21b
|
fix: 全面修复和优化 OSS 功能
## 安全修复
- 修复 /api/user/profile 接口泄露 OSS 密钥的安全漏洞
- 增强 getObjectKey 路径安全检查(空字节注入、URL 编码绕过)
- 修复 storage.end() 重复调用问题
- 增强上传签名接口的安全检查
## Bug 修复
- 修复 rename 使用错误的 PutObjectCommand,改为 CopyObjectCommand
- 修复 CopySource 编码问题,正确处理特殊字符
- 修复签名 URL 生成功能(添加 @aws-sdk/s3-request-presigner)
- 修复 S3Client 配置(阿里云 region 格式、endpoint 处理)
- 修复分页删除和列表功能(超过 1000 文件的处理)
- 修复分享下载使用错误的存储类型字段
- 修复前端媒体预览异步处理错误
- 修复 OSS 直传 objectKey 格式不一致问题
- 修复包名错误 @aws-sdk/request-presigner -> @aws-sdk/s3-request-presigner
- 修复前端下载错误处理不完善
## 新增功能
- 添加 OSS 连接测试 API (/api/user/test-oss)
- 添加重命名失败回滚机制
- 添加 OSS 配置前端验证
## 其他改进
- 更新 install.sh 仓库地址为 git.workyai.cn
- 添加 crypto 模块导入
- 修复代码格式和重复定义问题
- 添加缺失的表单对象定义
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 09:46:00 +08:00 |
|
Claude Opus
|
7aa8a862a4
|
chore: 优化代码质量和安全性\n\n- 删除未使用的 @aws-sdk/lib-storage 依赖,简化依赖\n- 修复重复导入 database 模块\n- 消除 formatSize 重复代码,提取为共享函数\n- 修复 verify.html XSS 漏洞,添加 HTML 转义\n- 更新 index.html 过时文案(断点续传→直连上传)
|
2026-01-18 20:23:39 +08:00 |
|
Claude Opus
|
2a4927f260
|
refactor: 优化代码重复和依赖导入
- ♻️ buildS3Config 复用 OssStorageClient.buildConfig (DRY 原则)
- ♻️ 删除重复的 crypto 导入(3处)
- ✅ 提高代码可维护性:配置逻辑只需在一处维护
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-18 18:27:43 +08:00 |
|
Claude Opus
|
92b70a11d7
|
refactor: 清理所有调试日志和死代码
- 🗑️ 删除未使用的依赖: net, dns 模块
- 🧹 将 console.log("[DEBUG]") 替换为 SystemLogDB.log()
- 🧹 清理分享验证相关的调试日志
- 🧹 清理数据库查询的调试日志
- 🧹 删除下载功能的调试日志
- ✅ 代码更专业,日志统一使用 SystemLogDB
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-18 18:09:18 +08:00 |
|
Claude Opus
|
0b0e5b9d7c
|
feat: v3.1.0 OSS直连优化与代码质量提升
- 🚀 OSS 直连上传下载(用户直连OSS,不经过后端)
- ✨ 新增 Presigned URL 签名接口
- ✨ 支持自定义 OSS endpoint 配置
- 🐛 修复 buildS3Config 不支持自定义 endpoint 的问题
- 🐛 清理残留的 basic-ftp 依赖
- ♻️ 更新 package.json 项目描述和版本号
- 📝 完善 README.md 更新日志和 CORS 配置说明
- 🔒 安全性增强:签名 URL 15分钟/1小时有效期
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-18 17:14:16 +08:00 |
|
|
|
d3fcb159f9
|
🐛 修复文件名包含反引号时变成undefined的问题
- 从sanitizeInput正则表达式中移除反引号
- 之前map中没有反引号映射导致返回undefined
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-30 15:27:59 +08:00 |
|
|
|
0e6230612c
|
🐛 加强文件名解码的空值处理
- 后端decodeHtmlEntities添加空字符串默认值
- 前端decodeHtmlEntities非字符串时返回空字符串
- getFileDisplayName增强类型检查
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-30 14:56:26 +08:00 |
|
|
|
4250e7de2f
|
✨ 添加displayName字段显示解码后的文件名
- 后端返回文件列表时添加displayName字段(解码HTML实体)
- 前端使用displayName显示文件名,保持原始name用于操作
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-30 13:54:58 +08:00 |
|
|
|
e8c6043a1f
|
🐛 修复特殊字符文件名的处理问题
- 添加decodeHtmlEntities函数解码HTML实体
- 在rename/mkdir/folder-info/delete接口中解码文件名和路径
- 删除操作支持多候选路径,处理二次编码情况
- 移除sanitizeInput中对反引号的转义
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-30 13:44:23 +08:00 |
|
|
|
962b01d05a
|
security: refreshToken 也存储在 HttpOnly Cookie 中
## 后端修改
- 登录时同时设置 token 和 refreshToken 的 HttpOnly Cookie
- refreshToken 有效期7天,token 有效期2小时
- 刷新接口优先从 Cookie 读取 refreshToken(向后兼容请求体)
- 登出时同时清除两个 Cookie
## 前端修改
- 移除 refreshToken 变量和相关逻辑
- 简化 doRefreshToken(),不再手动传递 refreshToken
- 简化 tryRefreshOrLogout(),直接尝试刷新
## 好处
- 页面刷新后 refreshToken 不会丢失
- 完全无感刷新,用户体验更好
- 前端代码更简洁(减少约20行)
- refreshToken 也无法被 XSS 窃取
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-30 10:38:40 +08:00 |
|
|
|
d05e3a22f1
|
security: 实施 HttpOnly Cookie 鉴权方案
## 后端修改
- 新增 /api/logout 接口清除认证 Cookie
## 前端修改
- 移除 localStorage 存储 token/refreshToken(防止 XSS 窃取)
- 移除所有手动 Authorization 头(共36处)
- checkLoginStatus 改为直接调用 API 验证(Cookie 自动携带)
- logout 改为调用后端接口清除 Cookie
- 简化 token 刷新逻辑
## 安全性提升
- Token 从 localStorage 迁移到 HttpOnly Cookie
- XSS 攻击无法通过 JS 读取 token
- 配合 SameSite 属性防御 CSRF 攻击
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-30 10:33:27 +08:00 |
|
|
|
4332057040
|
fix: 修复验证码session保存时序问题
问题原因:
- 验证码API在session.save()完成前就发送响应
- 导致客户端获取验证码图片时session可能未保存成功
修复:
- 将res.send()移到session.save()回调内
- 确保session保存成功后再返回验证码图片
- 添加验证码验证调试日志帮助诊断
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-28 14:11:36 +08:00 |
|
|
|
4f1a1ec97c
|
fix: 修复验证码请求429错误
问题:
- 短时间内多次请求验证码触发限流(429 Too Many Requests)
修复:
- 后端:验证码最小请求间隔从3秒改为1秒
- 前端:添加2秒防抖,避免重复请求
- 前端:429错误时保留已有验证码图片
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-28 14:06:23 +08:00 |
|
|
|
540c292d70
|
feat: 实现Token刷新机制,缩短登录有效期
安全改进:
- Access Token有效期从7天缩短为2小时
- 添加Refresh Token机制(有效期7天)
- 关闭浏览器后较快失效,提升安全性
后端修改(auth.js):
- 添加generateRefreshToken函数生成刷新令牌
- 添加refreshAccessToken函数验证并刷新access token
- 分离ACCESS_TOKEN_EXPIRES和REFRESH_TOKEN_EXPIRES配置
后端修改(server.js):
- 登录时返回refreshToken和expiresIn
- 添加/api/refresh-token接口用于刷新token
- Cookie有效期同步调整为2小时
前端修改(app.js):
- 保存refreshToken到localStorage
- 添加自动刷新定时器(过期前5分钟刷新)
- 页面加载时若token过期自动尝试刷新
- 登出时清除refreshToken和定时器
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-28 13:46:51 +08:00 |
|
|
|
1d65e97b04
|
feat: 注册、重置密码、重发验证邮件添加验证码功能
后端修改:
- 添加通用验证码验证函数 verifyCaptcha()
- /api/register 接口添加验证码验证
- /api/password/forgot 接口添加验证码验证
- /api/resend-verification 接口添加验证码验证
前端修改:
- 注册表单添加验证码输入框和图片
- 忘记密码模态框添加验证码
- 重发验证邮件区域添加验证码输入
- 添加各表单的验证码刷新方法
- 提交失败后自动刷新验证码
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-28 13:11:03 +08:00 |
|
|
|
f12b9b7291
|
✨ 添加主题切换功能:支持暗色/亮色玻璃主题
功能说明:
- 管理员可在系统设置中配置全局默认主题
- 普通用户可在设置页面选择:跟随全局/暗色/亮色
- 分享页面自动继承分享者的主题偏好
- 主题设置实时保存,刷新后保持
技术实现:
- 后端:数据库添加theme_preference字段,新增主题API
- 前端:CSS变量实现主题切换,localStorage缓存避免闪烁
- 分享页:加载时获取分享者主题设置
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-27 23:02:48 +08:00 |
|
|
|
c3bc58a88b
|
feat(admin): 添加系统日志功能
## 新功能
1. **系统日志数据库**
- 新增 system_logs 表
- 支持日志级别:debug/info/warn/error
- 支持日志分类:auth/user/file/share/system/security
- 记录用户ID、用户名、IP地址、User-Agent
2. **日志记录**
- 用户注册成功/失败
- 用户登录成功/失败(密码错误)
- 系统操作(日志清理等)
3. **管理员API**
- GET /api/admin/logs - 查询日志(支持分页和筛选)
- GET /api/admin/logs/stats - 获取日志统计
- POST /api/admin/logs/cleanup - 清理旧日志
4. **前端界面**
- 日志列表展示(时间、级别、分类、内容、用户、IP)
- 筛选功能(级别、分类、关键词搜索)
- 分页导航
- 清理旧日志功能
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-27 19:54:46 +08:00 |
|
|
|
15ea15518c
|
fix(security): 修复信任代理和HTTPS检测的安全漏洞
## 问题修复
1. **trust proxy 配置安全加固**
- 默认改为 false(不信任任何代理)
- 支持多种安全配置:数字跳数、loopback、IP/CIDR段
- 当配置为 true 时输出安全警告
2. **HTTPS 检测基于可信代理链**
- 使用 req.secure 替代直接读取 x-forwarded-proto
- Express 会根据 trust proxy 配置判断是否采信代理头
- 防止客户端伪造协议头绕过 HTTPS 强制
3. **客户端 IP 获取安全加固**
- 使用 req.ip 替代直接读取 X-Forwarded-For
- Express 会根据 trust proxy 配置正确处理代理链
- 防止客户端伪造 IP 绕过限流
4. **健康检测增加安全警告**
- trust proxy = true 时标记为严重安全问题
- 提示管理员配置更安全的代理信任策略
5. **安装脚本优化**
- 默认配置 TRUST_PROXY=1(单层Nginx场景)
- 添加详细的配置说明和安全警告
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-27 19:42:25 +08:00 |
|
|
|
1dde17bb04
|
feat(admin): 添加系统健康检测功能
新增管理员健康检测面板,可检测以下配置项:
- 安全配置:JWT密钥、CORS、HTTPS、管理员账号、登录防爆破
- 服务状态:SMTP邮件、数据库连接、存储目录
- 运行配置:反向代理支持、Node环境
修改文件:
- backend/auth.js: 新增 isJwtSecretSecure() 函数
- backend/server.js: 新增 /api/admin/health-check API
- frontend/app.js: 新增健康检测数据和方法
- frontend/app.html: 新增健康检测UI界面
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-27 19:37:42 +08:00 |
|
|
|
1b7585d54a
|
fix(security): 完善SSRF防护的IP地址检查
- 完整IPv6私有地址检查:fc00::/7, fe80::/10, ff00::/8
- 添加云服务元数据地址检查:169.254.0.0/16
- 添加运营商级NAT地址检查:100.64.0.0/10
- 支持IPv4映射的IPv6地址递归检查
- 使用正则表达式优化172.16.0.0/12检查
- 代码结构更清晰,按IPv4/IPv6分类处理
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-27 14:56:42 +08:00 |
|
|
|
4f9b281039
|
feat: 添加SFTP空间使用统计功能
- 新增 /api/user/sftp-usage API,递归统计SFTP服务器空间使用情况
- 返回总使用空间、文件数、文件夹数
- 在设置页面显示SFTP空间统计信息
- 支持手动刷新统计数据
- 适配"仅SFTP"和"用户可选"两种权限模式的UI
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-27 13:39:51 +08:00 |
|
|
|
1943fea2e6
|
🐛 修复本地存储文件删除失败的问题
问题:sanitizeInput 函数将 / 转义为 /,导致文件路径错误
修复:从 XSS 过滤中移除对 / 的转义,因为它是路径分隔符的合法字符
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 11:44:51 +08:00 |
|
|
|
2fb2321750
|
🔒 修复分享列表接口的目录遍历漏洞
- 在 /api/share/:code/list 增加路径规范化与范围校验
- 使用 path.posix.normalize 处理 subPath,阻断 ../ 遍历攻击
- 调用 isPathWithinShare 验证请求路径在分享范围内
- 统一使用安全的 requestedPath 进行存储访问和直链生成
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 11:10:48 +08:00 |
|
|
|
3045c354f4
|
✨ 优化上传体验:上传前检查文件大小限制
问题:原来文件上传完成后才提示超过大小限制,浪费用户时间
修复:
- 后端:添加 /api/config 公开接口返回上传大小限制
- 前端:页面加载时获取配置
- 前端:uploadFile 函数开始时检查文件大小,超限立即提示
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 10:46:10 +08:00 |
|
|
|
406b93019c
|
🐛 修复管理员存储统计磁盘容量显示为0的问题
- 将存储目录路径从 local-storage 改为 storage,与 storage.js 保持一致
- 添加目录不存在时自动创建的逻辑
- 支持 STORAGE_ROOT 环境变量配置
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 09:57:06 +08:00 |
|
|
|
474c8fe9b5
|
🔒 安全加固:修复多个中高危漏洞
修复内容:
1. Host Header 注入 - 添加 PUBLIC_BASE_URL 和 ALLOWED_HOSTS 白名单
2. API密钥暴力破解 - 添加速率限制(5次/小时,封锁24小时)
3. 路径遍历漏洞 - 增强路径验证,防止空字节注入和目录遍历
4. 令牌安全 - 密码重置和邮箱验证令牌使用SHA256哈希存储
5. 文件上传安全 - 阻止PHP/JSP/ASP等可执行脚本上传
6. IDOR防护 - 增强权限验证和安全日志
7. XSS防护 - 增强输入过滤,阻止javascript:等危险协议
8. 日志脱敏 - 移除验证码等敏感信息的日志输出
9. CSRF增强 - HTTPS环境使用strict模式Cookie
10. 邮箱枚举防护 - 密码重置统一返回消息
11. 速率限制 - 文件列表(60次/分)和上传(100次/小时)
配置说明:
- PUBLIC_BASE_URL: 必须配置,用于生成安全的邮件链接
- ALLOWED_HOSTS: 可选,Host头白名单
- COOKIE_SECURE=true: 生产环境必须开启
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 09:48:46 +08:00 |
|
|
|
47fe1466a4
|
🔒 修复中高危安全漏洞并增强文件安全验证
**关键安全修复:**
1. 修复弱随机数生成器(中危)
- 分享码生成从Math.random()改为crypto.randomBytes()
- 防止分享链接被预测或暴力猜测
2. 增强文件上传安全验证(中危)
- 新增isSafePathSegment()函数验证文件名
- 禁止路径遍历字符(..、/、\、控制字符)
- 添加上传路径规范化和安全检查
**功能改进:**
- 管理员界面显示用户邮箱验证状态
- 优化用户状态展示(已封禁/未激活/正常)
**安全影响:**
- 消除分享链接可预测性风险
- 防止文件上传路径遍历攻击
- 提升文件系统访问控制安全性
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 01:37:02 +08:00 |
|
|
|
3e4aae60cb
|
🔒 修复命令注入漏洞并增强HTTPS配置
**安全修复:**
- 修复命令执行语法错误(wmic命令字符串拼接)
- 添加驱动器字母验证防止命令注入(仅允许A-Z)
- 修复命令执行参数构造错误
**功能增强:**
- 新增ENFORCE_HTTPS环境变量(强制HTTPS访问)
- 更新.env.example添加ENFORCE_HTTPS配置说明
- 更新install.sh支持自动配置ENFORCE_HTTPS
- 更新脚本自动为现有.env补充ENFORCE_HTTPS配置
这些改进消除了命令注入风险并提供了更灵活的HTTPS策略控制。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 01:17:32 +08:00 |
|
|
|
2ba254b1b5
|
🔒 增强安全防护:新增多层输入验证和XSS防护
- 添加用户名正则验证(支持中英文、数字、下划线等)
- 新增HTTPS强制访问选项(通过环境变量控制)
- 实现HTML转义函数防止邮件XSS注入
- 增强HTTP直链URL校验,仅允许http/https协议
- 添加buildHttpDownloadUrl安全构建下载URL
- 优化密码重置流程,增加账号状态验证
- 全面应用sanitizeHttpBaseUrl确保URL安全
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-25 00:52:56 +08:00 |
|
|
|
4e4ef0405b
|
🔒 增强安全防护:防止 SSRF 攻击和 Token 泄露
后端安全增强:
- 新增 SSRF 防护机制,验证 SFTP 目标地址
- 添加 isPrivateIp() 函数,检测并阻止连接内网地址
- 添加 validateSftpDestination() 函数,验证主机名和端口
- 支持 DNS 解析和 IP 地址验证
- 添加 SFTP 连接超时配置(默认8秒)
- 移除 URL 参数中的 token 认证,只接受 Header 或 HttpOnly Cookie
前端安全改进:
- 移除下载链接中的 token 参数
- 改为依赖同域 Cookie 进行身份验证
- 避免 token 在 URL 中暴露,防止日志泄露
环境变量配置:
- ALLOW_PRIVATE_SFTP=true 可允许连接内网(测试环境)
- SFTP_CONNECT_TIMEOUT 可配置连接超时时间
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 20:07:34 +08:00 |
|
|
|
02f0f3aa24
|
🔥 移除旧密码重置审核系统 & ✨ 优化存储管理UI
后端改进:
- 移除需要管理员审核的密码重置请求功能
- 简化密码重置流程,直接使用邮件重置
- 删除 password_reset_requests 表及相关代码
前端优化:
- 重新设计存储管理界面,采用现代化渐变风格
- 改进存储方式切换交互,添加动画效果
- 优化视觉层次和信息展示
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 19:12:57 +08:00 |
|
|
|
104d7fe0ef
|
✨ 优化邮件验证和密码重置链接
- 修改邮件中的验证和重置链接,直接指向 app.html 页面
- 在落地页添加容错脚本,自动重定向带 token 的请求到应用页
- 提升用户体验,减少跳转步骤
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 18:57:50 +08:00 |
|
|
|
cfbb134587
|
🐛 修复邮箱验证和密码重置的时间戳问题
后端修复:
- 修改时间戳存储格式:从 ISO 字符串改为数值时间戳(毫秒)
- 优化时间戳比较逻辑:兼容新旧格式的时间戳
- 修复 VerificationDB.consumeVerificationToken() 的时间比较
- 修复 PasswordResetTokenDB.use() 的时间比较
- 统一使用 Date.now() 生成时间戳
前端改进:
- 新增 verifyMessage 独立显示验证相关提示
- 优化邮箱验证成功后的用户体验(自动切换到登录表单)
- 优化密码重置成功后的用户体验(自动切换到登录表单)
- 改进提示信息显示方式
技术细节:
- SQLite 时间比较:strftime('%s','now')*1000 获取当前毫秒时间戳
- 兼容旧数据:同时支持字符串和数值时间戳比较
这个修复解决了邮箱验证令牌一直提示过期的问题。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 15:48:32 +08:00 |
|
|
|
5ed13351f9
|
🐛 修复邮件发送功能的小问题
- 修复发件人字段处理,避免空字符串导致发送失败
- 改进SMTP测试错误消息显示,支持详细错误信息
- 更新package-lock.json锁定nodemailer版本
这些修复提升了邮件功能的稳定性和错误提示的友好性。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 14:37:34 +08:00 |
|
|
|
6958655d6e
|
✉️ 添加完整的邮件系统功能
后端新增功能:
- 集成 nodemailer 支持 SMTP 邮件发送
- 新增邮箱验证系统(VerificationDB)
- 新增密码重置令牌系统(PasswordResetTokenDB)
- 实现邮件发送限流(30分钟3次,全天10次)
- 添加 SMTP 配置管理接口
- 支持邮箱激活和密码重置邮件发送
前端新增功能:
- 注册时邮箱必填并需验证
- 邮箱验证激活流程
- 重发激活邮件功能
- 基于邮箱的密码重置流程(替代管理员审核)
- 管理后台 SMTP 配置界面
- SMTP 测试邮件发送功能
安全改进:
- 邮件发送防刷限流保护
- 验证令牌随机生成(48字节)
- 重置链接有效期限制
- 支持 SSL/TLS 加密传输
支持的邮箱服务:QQ邮箱、163邮箱、企业邮箱等主流SMTP服务
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 14:28:35 +08:00 |
|
|
|
fafd897588
|
🚀 增强验证码安全性和防刷机制
- 添加验证码请求限流器(30次/10分钟,超限封锁30分钟)
- 添加验证码请求间隔控制(最小3秒间隔)
- 升级验证码复杂度:4位数字 → 6位字母数字混合
- 移除易混淆字符(I/l/O/0/1等)
- 优化验证码显示参数(尺寸、干扰线等)
这些改进大幅提升了验证码的安全性,有效防止暴力破解和恶意刷新。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 10:25:10 +08:00 |
|
|
|
46fb4d0fd0
|
🔧 改进反向代理和Session安全配置
- 添加trust proxy配置,支持在Nginx/Cloudflare后正确识别客户端IP和协议
- 优化Session cookie配置,HTTPS环境下使用sameSite=none以支持跨域
- 移除测试脚本test_captcha.sh
这些改进确保系统在反向代理环境下正常工作,并提升了安全性。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-24 10:03:57 +08:00 |
|
|
|
7ce9d95d44
|
🐛 修复验证码Session问题 - 验证码过期Bug修复
## 问题描述
用户输入验证码后一直提示"验证码已过期"
## 根本原因
Session配置问题导致验证码无法正确保存和读取:
1. saveUninitialized: false 导致验证码请求时session不会被创建
2. 缺少 sameSite 属性导致某些情况下cookie无法正确传递
## 修复方案
### Session配置优化
- saveUninitialized: false → true (确保验证码请求时创建session)
- 添加 name: 'captcha.sid' (自定义session cookie名称)
- 添加 sameSite: 'lax' (防止CSRF同时确保同站请求携带cookie)
### 验证码生成API增强
- 添加 req.session.save() 确保session立即保存
- 添加调试日志输出SessionID和验证码内容
### 登录API调试
- 添加详细的验证码验证日志
- 输出SessionID、失败次数、验证码匹配情况
- 帮助快速定位问题
## 测试建议
1. 清除浏览器Cookie
2. 输错密码2次触发验证码
3. 查看后端日志确认SessionID一致
4. 输入正确验证码应该能通过验证
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-21 16:39:38 +00:00 |
|
|
|
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 |
|
|
|
746539a067
|
🔒 修复CORS逻辑 - 正确处理同源请求
问题:
- 第一次修复过于严格,拒绝了所有无Origin头的请求
- 导致浏览器的同源请求被拒绝,网站完全无法使用
修复方案:
- 允许无Origin头的请求(同源请求不触发CORS)
- 严格验证带Origin头的跨域请求(必须在白名单中)
- 拒绝所有未授权的跨域请求
文件修改:
- backend/server.js: 修正CORS中间件逻辑(第48-63行)
测试:
- 同源请求正常工作
- 恶意跨域请求被拒绝
- API返回正确的状态码(不再是500错误)
|
2025-11-18 17:08:22 +08:00 |
|
|
|
e026c13fd3
|
🔒 修复CORS严重安全漏洞 & 增强Nginx安全配置
## 关键修复
### 1. 修复backend/server.js的CORS漏洞 ⚠️ CRITICAL
**问题**: 原代码 `if (!origin || allowedOrigins.includes(origin))`
会允许所有没有Origin头的请求通过,导致恶意请求绕过CORS保护
**修复**: 严格白名单模式
```javascript
// 只允许白名单中的域名
if (origin && allowedOrigins.includes(origin)) {
callback(null, true);
} else {
// 拒绝所有其他请求
callback(new Error('CORS策略不允许来自该来源的访问'));
}
```
**影响**:
- ✅ 阻止所有恶意域名的跨域访问
- ✅ 保护JWT token不被窃取
- ✅ 从63.6%预计提升到90%+安全评分
### 2. 增强install.sh中的Nginx安全配置
在所有三个nginx配置函数中添加了完整的安全规则:
- `configure_nginx_http_first()` - 初始HTTP配置
- `configure_nginx_http()` - 纯HTTP模式
- `configure_nginx_https()` - HTTPS模式
**新增安全配置**:
```nginx
# 安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # HTTPS专用
# 隐藏Nginx版本
server_tokens off;
# 禁止访问隐藏文件 (.git, .env等)
location ~ /\. {
deny all;
return 404;
}
# 禁止访问敏感文件
location ~ \.(env|git|config|key|pem|crt|sql|bak|backup|old|log)$ {
deny all;
return 404;
}
```
**防护效果**:
- ✅ 阻止访问 /.env, /.git/config
- ✅ 阻止访问备份文件 .bak, .sql
- ✅ 防止点击劫持、XSS、MIME嗅探攻击
- ✅ 强制HTTPS(HTTPS环境下)
- ✅ 隐藏服务器信息
## 部署方法
在服务器上执行:
```bash
cd /var/www/wanwanyun
git pull origin master
bash install.sh --repair # 重新生成Nginx配置
# 或者手动
pm2 restart wanwanyun-backend
nginx -t && systemctl reload nginx
```
然后运行安全测试验证:
```bash
node security-test.js
```
预期改进:
- CORS测试: 只有cs.workyai.cn被允许 ✅
- 敏感文件: 全部返回404 ✅
- 安全响应头: 全部检测到 ✅
- 安全评分: 63.6% → 90%+ 🎯
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-18 16:58:19 +08:00 |
|
|
|
32429334ab
|
🔒 重大安全更新:修复CORS、XSS、敏感文件暴露等漏洞
本次更新修复了安全测试中发现的所有严重问题,大幅提升系统安全性。
## 修复的安全问题
### 1. CORS跨域配置漏洞 ⚠️ 严重
**问题**: 默认允许所有域名访问(ALLOWED_ORIGINS=*)
**修复**:
- 默认值改为空数组,生产环境必须明确配置域名白名单
- 未配置时拒绝所有跨域请求(生产环境)
- 开发环境仅允许localhost访问
### 2. XSS跨站脚本攻击 ⚠️ 严重
**问题**: 用户输入未过滤,可注入恶意脚本
**修复**:
- 添加XSS过滤中间件,自动转义所有POST/PUT请求的用户输入
- 过滤 <, >, ', " 等危险字符
- 递归处理嵌套对象和数组
### 3. 缺少安全响应头 ⚠️ 重要
**问题**: 缺少X-Frame-Options等安全响应头
**修复**:
- X-Frame-Options: SAMEORIGIN (防止点击劫持)
- X-Content-Type-Options: nosniff (防止MIME嗅探)
- X-XSS-Protection: 1; mode=block
- Strict-Transport-Security (HTTPS环境)
- Content-Security-Policy (内容安全策略)
- 隐藏X-Powered-By和Server版本信息
### 4. 敏感文件暴露风险 ⚠️ 严重
**问题**: .env、.git等敏感文件可能被访问
**修复**:
- Nginx配置禁止访问以.开头的隐藏文件
- 禁止访问.env、.git、.config、.key、.pem等敏感文件
- 更新.gitignore,防止敏感文件提交到代码仓库
- 添加证书、密钥等文件类型到忽略列表
## 代码改动
### backend/server.js
- 修改CORS默认配置,移除危险的 * 通配符
- 添加安全响应头中间件
- 添加XSS过滤中间件(sanitizeInput函数)
- 生产环境强制检查ALLOWED_ORIGINS配置
### nginx/nginx.conf
- 添加安全响应头配置
- 禁止访问隐藏文件和敏感文件的location规则
- 隐藏Nginx版本号(server_tokens off)
### .gitignore
- 添加敏感配置文件保护(.env.local, config.json等)
- 添加证书和密钥文件类型(.key, .pem, .crt等)
### deploy.sh
- 修改默认配置,移除ALLOWED_ORIGINS=*
- 添加安全警告提示
## 部署说明
⚠️ **重要**: 更新后必须配置ALLOWED_ORIGINS环境变量!
### 手动部署
编辑 `backend/.env` 文件:
```bash
ALLOWED_ORIGINS=https://cs.workyai.cn
NODE_ENV=production
```
### 使用install.sh部署
脚本会自动根据域名配置ALLOWED_ORIGINS
## 测试结果
修复前安全评分: 57.6% (14个安全问题)
修复后预期评分: 90%+ (预计解决12+个问题)
## 兼容性
- ✅ 向后兼容,不影响现有功能
- ✅ 开发环境自动允许localhost访问
- ⚠️ 生产环境必须配置ALLOWED_ORIGINS(否则无法访问)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-18 16:29:44 +08:00 |
|
WanWanYun
|
0bb7bd5219
|
fix: 修复文件夹详情功能 + 添加文件夹分享
修复内容:
1. 【文件夹详情无反应】
- 问题: folder-info API中变量名冲突
- 原因: API参数名'path'与Node.js的'path'模块冲突
- 具体: 第1193行 `const itemPath = path.join(dirPath, item.name)`
这里的path被当作API参数(字符串)而不是模块
- 修复:
* API参数改为 `const { path: dirPath, folderName }`
* 使用dirPath替代path
* countFiles函数参数改为countDirPath避免混淆
- 效果: 查看详情功能现在正常工作
新功能:
2. 【文件夹分享】
- 移除分享功能的文件限制
- 右键菜单"分享"选项对文件和文件夹都显示
- 文件夹分享后可访问该文件夹下所有文件
- 与现有分享API完全兼容(share_type支持file和all)
技术细节:
- backend/server.js:
* 第1138行: path参数改为dirPath
* 第1186行: countFiles函数参数改为countDirPath
* 第1193行: 使用path.join正确引用模块
- frontend/app.html:
* 移除 `v-if="!contextMenuFile.isDirectory"` 限制
* 文件夹也显示"分享"菜单项
使用方式:
1. 右键文件夹 → "查看详情" → 显示大小、文件数、子文件夹数
2. 右键文件夹 → "分享" → 分享整个文件夹
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-16 00:15:43 +08:00 |
|
WanWanYun
|
f64f86cd78
|
fix: 修复文件夹右键菜单问题 + 新增文件夹详情功能
修复内容:
1. 【文件夹右键菜单无法显示】
- 问题: showFileContextMenu() 中仍有 `if (file.isDirectory) return` 阻止代码
- 原因: 之前的修复脚本替换失败,代码仍在
- 修复: 手动移除这行限制代码
- 效果: 文件夹现在可以正常右键操作(重命名、删除、查看详情)
新功能:
2. 【文件夹详情查看】
后端API (POST /api/files/folder-info):
- 接收参数: path(当前路径), folderName(文件夹名称)
- 计算文件夹总大小(递归统计所有文件)
- 统计文件数量和子文件夹数量
- 返回数据: name, path, size, fileCount, folderCount
- 仅支持本地存储
前端功能:
- 右键菜单新增"查看详情"选项(仅文件夹显示)
- 详情弹窗显示:
* 文件夹名称
* 文件夹路径
* 总大小(格式化显示)
* 文件数量
* 子文件夹数量
- 加载中状态提示
- 错误处理和提示
使用方式:
1. 右键点击任意文件夹
2. 选择"查看详情"
3. 弹窗显示文件夹统计信息
技术改动:
- backend/server.js: +100行 (新增folder-info API)
- frontend/app.html: +40行 (详情弹窗UI + 菜单项)
- frontend/app.js: +30行 (状态 + showFolderInfo方法)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-16 00:07:21 +08:00 |
|
WanWanYun
|
e5c932a351
|
feat: 新增本地存储文件夹管理功能
新功能概述:
- 支持在本地存储模式下创建文件夹
- 支持删除文件夹(递归删除)
- 支持重命名文件夹(已有功能,天然支持)
- 文件夹配额计算正确
后端改动:
1. 新增创建文件夹API (backend/server.js)
- POST /api/files/mkdir
- 参数: path(当前路径), folderName(文件夹名称)
- 安全检查: 禁止特殊字符(/ \ .. :),防止路径遍历攻击
- 仅限本地存储使用
- 创建前检查文件夹是否已存在
2. 改进删除功能 (backend/storage.js)
- LocalStorageClient.delete() 现在支持删除文件夹
- 使用 fs.rmSync(path, { recursive: true }) 递归删除
- 新增 calculateFolderSize() 方法计算文件夹总大小
- 删除文件夹时正确更新配额使用情况
前端改动:
1. 新建文件夹按钮 (frontend/app.html)
- 在"上传文件"按钮旁新增"新建文件夹"按钮
- 仅本地存储模式显示
2. 新建文件夹弹窗 (frontend/app.html)
- 简洁的创建表单
- 支持回车键快速创建
- 使用优化的弹窗关闭逻辑(防止拖动选择文本时误关闭)
3. 前端API调用 (frontend/app.js)
- 新增 createFolderForm 状态
- 新增 createFolder() 方法
- 前端参数验证
- 创建成功后自动刷新文件列表
4. 右键菜单优化 (frontend/app.html)
- 文件夹不显示"下载"按钮(文件夹暂不支持打包下载)
- 文件夹不显示"分享"按钮(分享单个文件夹暂不支持)
- 文件夹支持"重命名"和"删除"操作
安全性:
- 文件夹名称严格验证,禁止包含 / \ .. : 等特殊字符
- 路径安全检查,防止目录遍历攻击
- 仅限本地存储模式使用(SFTP存储使用上传工具管理)
配额管理:
- 空文件夹不占用配额
- 删除文件夹时正确释放配额(计算所有子文件大小)
- 删除非空文件夹会递归删除所有内容
使用方式:
1. 登录后切换到本地存储模式
2. 点击"新建文件夹"按钮
3. 输入文件夹名称,点击创建
4. 双击文件夹进入,支持多级目录
5. 右键文件夹可重命名或删除
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-15 23:46:20 +08:00 |
|
|
|
a41a29d581
|
fix: 分享详情页显示到期时间
问题:
- 分享列表中显示的到期时间正确
- 但点进分享详情页时,到期时间只显示"永久有效"
原因:
- /api/share/:code/verify 接口返回的 share 对象中缺少 expires_at 字段
- 前端 shareInfo.expires_at 为 undefined,导致始终显示"永久有效"
修复:
- 在 server.js:1650 添加 expires_at 到响应数据中
- 现在分享详情页能正确显示到期时间
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-14 20:59:48 +08:00 |
|
|
|
eaf9ad7bb1
|
debug: 添加详细的分享验证调试日志
## 调试内容
为了排查过期分享仍能访问的问题,添加了详细的调试日志:
### 1. database.js - ShareDB.findByCode()
- 记录调用时的参数和SQLite当前时间
- 记录SQL查询结果(是否找到、过期时间、分享类型)
- 便于对比JavaScript时间和SQLite时间
### 2. server.js - /api/share/:code/verify
- 记录请求时间戳、分享码、是否有密码、请求IP
- 记录findByCode的返回结果和过期状态
### 3. server.js - /api/share/:code/list
- 记录请求时间戳、分享码、子路径、密码状态
- 记录findByCode的返回结果和过期状态
## 使用方法
1. 管理员在管理后台开启调试模式
2. 访问分享链接 https://cs.workyai.cn/s/oSrhV9D3
3. 查看后端console日志输出
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-14 16:09:01 +08:00 |
|