|
|
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 |
|
|
|
84e9a19f3e
|
fix: 修复分享到期时间显示的两个问题
问题1: 分享成功提示中到期时间显示为"永久有效"
- 修复: backend/database.js 的create方法添加返回expires_at字段
- 修复: backend/server.js 的API响应中添加expires_at字段
- 现在创建分享后会正确显示设置的到期时间
问题2: share.html分享页面不显示到期时间
- 新增: 在分享信息中添加到期时间显示(frontend/share.html:527-528)
- 新增: 添加formatExpireTime/isExpiringSoon/isExpired方法
- 效果: 访问分享页面时可以看到"到期时间"或"永久有效"
改进:
- 使用颜色区分状态(绿色=永久/正常, 黄色=即将过期, 红色=已过期)
- 友好的时间显示格式(X天后过期/明天过期等)
注意: 关于0.01天显示问题的优化方案已文档化,需要手动修改app.js
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-14 13:54:38 +08:00 |
|
|
|
4879d4891f
|
fix: 修复分享过期时间和防爆破保护覆盖不全的安全问题
问题1 - 分享过期时间未强制校验:
- 在ShareDB.findByCode()中添加过期时间检查
- SQL条件: AND (s.expires_at IS NULL OR s.expires_at > datetime('now'))
- 现在过期的分享链接将返回404,无法访问
问题2 - 分享密码防爆破保护覆盖不全:
- 给/api/share/:code/list添加shareRateLimitMiddleware
- 给/api/share/:code/download-file添加shareRateLimitMiddleware
- 在两个接口的密码验证失败时调用recordFailure
- 在两个接口的密码验证成功时调用recordSuccess
- 防止攻击者绕过/verify接口直接暴力破解
影响:
- 分享过期后将无法访问(安全性提升)
- 所有分享密码验证接口都受到限流保护(10次/10分钟)
- 修复了可绕过防爆破保护的安全漏洞
|
2025-11-14 00:15:15 +08:00 |
|
|
|
f6e88d85e7
|
fix: 修复防爆破保护不生效的问题
问题原因:
- 登录接口缺少recordFailure调用
- 分享密码接口缺少recordFailure和recordSuccess调用
修复内容:
- 在用户不存在时记录失败尝试
- 在密码错误时记录失败尝试
- 在分享密码错误时记录失败尝试
- 在分享密码验证成功时清除失败记录
测试方法:
- 连续5次错误登录后应被封锁30分钟
- 连续10次错误分享密码后应被封锁20分钟
|
2025-11-13 23:20:25 +08:00 |
|
|
|
c439966bc5
|
feat: 添加登录和分享密码防爆破保护
- 新增RateLimiter类实现基于IP和用户名的限流
- 登录接口: 5次失败/15分钟后封锁30分钟
- 分享密码: 10次失败/10分钟后封锁20分钟
- 支持X-Forwarded-For反向代理
- 自动清理过期记录
- 详细的安全日志记录
|
2025-11-13 22:45:22 +08:00 |
|
|
|
c8f3ab5881
|
feat: 修复CORS安全漏洞 + 升级主页设计
🔒 安全修复:
- 修复分享链接HTTP/HTTPS协议识别问题
- 自动配置CORS安全策略(根据部署模式)
- 自动配置Cookie安全设置(HTTPS环境)
- 移除不安全的默认CORS配置
✨ 功能改进:
- install.sh: 升级create_env_file()函数,智能配置CORS
* 域名+HTTPS模式: ALLOWED_ORIGINS=https://domain
* 域名+HTTP模式: ALLOWED_ORIGINS=http://domain
* IP模式: 留空并显示安全警告
- backend/server.js: 添加getProtocol()函数,正确识别HTTPS
- backend/.env.example: 完全重写,添加详细的CORS配置说明
🎨 主页升级:
- frontend/index.html: 全新现代化设计
* 渐变背景+动画效果
* 9大功能特性展示
* 8项技术栈展示
* 完美响应式支持
📝 修改文件:
- backend/server.js (第63-83行, 1255行, 1282行)
- install.sh (第2108-2195行)
- backend/.env.example (完全重写)
- frontend/index.html (完全重写)
🔗 相关问题:
- 修复CORS允许任意域名访问的安全漏洞
- 修复分享链接使用HTTP的问题
- 解决Cookie在HTTP环境下的安全隐患
💡 向后兼容:
- 已部署项目可选择性升级
- 手动添加ALLOWED_ORIGINS配置即可生效
🎉 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-13 21:36:49 +08:00 |
|
|
|
bfa07c53bb
|
fix: 修复shareOwner变量作用域错误
问题:在/api/share/:code/verify接口中,shareOwner在定义前被使用
修复:将shareOwner定义移至使用之前
|
2025-11-13 19:32:43 +08:00 |
|
|
|
2f2f712dae
|
Merge branch 'master' of https://gitee.com/yu-yon/vue-driven-cloud-storage
|
2025-11-13 18:00:34 +08:00 |
|
|
|
04e9ff5b7e
|
fix: 修复两个安全漏洞
1. 修复分享下载接口越权访问漏洞(高危)
- 添加isPathWithinShare函数验证请求路径是否在分享范围内
- 单文件分享只允许下载该文件
- 目录分享只允许下载该目录及子目录的文件
- 防止攻击者通过构造path参数访问分享者的任意文件
- 相关文件:backend/server.js
2. 修复本地存储路径处理问题(中高危)
- 优化getFullPath方法处理绝对路径的逻辑
- 修复Linux环境下path.join处理'/'导致的路径错误
- 将绝对路径转换为相对路径,确保正确拼接用户目录
- 相关文件:backend/storage.js
🔐 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-13 18:00:09 +08:00 |
|
WanWanYun
|
e5ba17329c
|
功能: 添加管理员上传工具检测和上传功能
- 后端: 添加 GET /api/admin/check-upload-tool 检测工具是否存在
- 后端: 添加 POST /api/admin/upload-tool 允许管理员手动上传exe
- 前端: 管理员界面新增上传工具管理卡片
- 前端: 支持检测工具状态、显示文件信息、手动上传
- 验证: 文件必须是.exe格式且大小>20MB
|
2025-11-12 20:45:17 +08:00 |
|
WanWanYun
|
c272724c5c
|
修复: 防止管理员封禁自己的账号
- 在封禁用户API中添加自我封禁检查
- 当管理员尝试封禁自己时返回400错误
- 错误消息: "不能封禁自己的账号"
- 解封自己不受限制(虽然被封禁后无法登录后台操作)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-12 11:38:02 +08:00 |
|
WanWanYun
|
0c55b599ef
|
修复: 非标准端口部署时分享链接未携带端口号的问题
- 添加 generateShareUrl 辅助函数,智能处理端口号
- 支持通过 PUBLIC_PORT 环境变量配置nginx监听端口
- 更新 POST /api/share/create 使用新的URL生成方法
- 更新 GET /api/share/my 使用新的URL生成方法
- 修复IP模式部署时分享链接无法正常访问的问题
|
2025-11-11 23:25:05 +08:00 |
|
|
|
88f2b152f6
|
修复: 分享下载使用分享者当前存储类型而非创建时存储类型
- 问题: 用户切换到本地存储后,旧分享仍使用创建时的SFTP存储类型,导致404错误
- 修复: 在4个位置将share.storage_type改为shareOwner.current_storage_type
- /api/share/:code/verify (缓存未命中逻辑)
- /api/share/:code/verify (错误回退逻辑)
- /api/share/:code/list (文件列表)
- /api/share/:code/download-file (文件下载)
- 重构: 调整代码顺序,先获取shareOwner再定义storageType
- 日志: 添加"(分享者当前)"标识,便于调试
|
2025-11-11 18:29:20 +08:00 |
|
|
|
230937eba8
|
修复: 添加原密码验证UI并修复中文文件名乱码
## 问题1: 修改密码缺少原密码验证UI
后端已有current_password验证,但前端没有输入框:
- 用户无法输入当前密码
- 导致密码修改功能无法正常使用
修复内容(前端):
1. app.html: 添加当前密码输入框
2. app.js:
- 添加current_password字段到data
- 添加current_password必填验证
- 请求体中包含current_password
- 成功后清空current_password
## 问题2: 中文文件名上传后乱码
原因:
- multer默认将文件名从UTF-8转换为Latin1编码
- req.file.originalname获取到的是乱码
修复内容(后端):
1. 配置multer.diskStorage自定义文件名处理
2. 在filename回调中将Latin1转回UTF-8:
Buffer.from(file.originalname, 'latin1').toString('utf8')
3. 在上传路由中同样转换originalname
4. 临时文件名使用时间戳+随机数+原始文件名避免冲突
影响范围:
- 所有文件上传操作
- 中文、日文、韩文等非ASCII文件名
测试建议:
- 上传中文文件名文件(如测试文档.pdf)
- 上传emoji文件名
- 修改密码功能完整流程测试
|
2025-11-11 16:09:49 +08:00 |
|
|
|
9eade3e3e6
|
性能: 优化磁盘信息获取方式,改为异步执行
问题:
- /api/admin/storage-stats 使用 execSync 同步执行 df/wmic 命令
- 同步执行会阻塞事件循环,影响并发请求处理
- 磁盘信息获取可能需要几百毫秒,影响响应速度
优化内容:
1. 导入 util.promisify 将 exec 转换为异步函数
2. 将路由处理函数改为 async
3. 使用 execAsync 替代 execSync 执行 df 命令
4. 使用 execAsync 替代 execSync 执行 wmic 命令
优势:
- 不阻塞事件循环,提升并发性能
- 管理员查看存储统计时不影响其他用户操作
- 更符合 Node.js 最佳实践
|
2025-11-11 15:24:39 +08:00 |
|
|
|
60bc89ffea
|
修复: 修复文件下载时storage连接资源泄漏问题
问题:
- /api/files/download 路由在文件流下载时没有关闭storage连接
- 当下载大文件或多个并发下载时,会导致SFTP连接积累
- 可能导致连接池耗尽和内存泄漏
修复内容:
1. 添加stream.on('error')事件处理:流错误时关闭storage连接
2. 添加stream.on('close')事件处理:流传输完成时关闭storage连接
3. 增强catch块:在stream创建之前发生错误时关闭storage连接
影响范围:
- /api/files/download(用户文件下载)
- /api/share/:code/download-file(分享文件下载,已有处理逻辑)
测试建议:
- 测试正常文件下载
- 测试下载过程中断(用户取消下载)
- 测试下载不存在的文件(错误处理)
- 测试大文件下载和并发下载
|
2025-11-11 15:06:20 +08:00 |
|
|
|
c9553ff497
|
修复: 添加分享缓存过期机制(TTL)
问题描述:
- 分享文件缓存使用Map没有过期机制
- 缓存会无限增长,占用内存
- 文件更新或删除后缓存不会自动清除
- 长期运行可能导致内存泄漏
修复内容:
1. 实现TTLCache类
- 支持自定义过期时间(默认1小时)
- 自动检查缓存是否过期
- API完全兼容Map(set/get/has/delete)
2. 添加自动清理机制
- 每10分钟自动清理过期缓存
- 记录清理日志便于监控
- 提供destroy方法停止清理定时器
3. 替换shareFileCache为TTLCache实例
- 设置1小时TTL
- 无需修改现有代码
- 向后兼容所有现有使用
缓存特性:
- get()时自动检查过期
- has()时自动检查过期
- 定期清理避免内存积累
- size()方法获取当前缓存数量
影响范围: 分享文件缓存管理
测试建议:
- 验证分享链接访问后缓存生效
- 验证1小时后缓存自动失效
- 监控日志确认定期清理执行
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 14:19:35 +08:00 |
|
|
|
4a9d31806b
|
修复: 优化文件上传临时文件清理机制
问题描述:
- 文件删除操作可能抛出异常导致程序中断
- 服务器崩溃或重启后残留临时文件无法清理
- 没有自动清理机制
修复内容:
1. 添加safeDeleteFile()安全删除函数
- 使用try-catch捕获删除异常
- 记录删除日志和错误信息
- 不会因删除失败而中断主流程
2. 添加cleanupOldTempFiles()定期清理函数
- 启动时自动清理超过24小时的临时文件
- 防止临时文件堆积占用磁盘空间
- 容错处理避免清理失败影响启动
3. 替换所有fs.unlinkSync为safeDeleteFile
- 文件大小超限时的临时文件清理
- 上传成功后的临时文件清理
- 上传失败时的临时文件清理
影响范围: 文件上传功能
测试建议:
- 上传文件后检查uploads目录临时文件已删除
- 重启服务器验证旧临时文件自动清理
- 模拟删除失败场景验证不影响主流程
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 13:46:33 +08:00 |
|
|
|
3359cb8c01
|
安全: 为Cookie添加secure和sameSite安全标志
问题描述:
- Cookie仅设置了httpOnly,缺少其他安全标志
- 未启用secure标志,HTTPS环境下cookie可能被劫持
- 缺少sameSite保护,存在CSRF风险
修复内容:
1. 添加secure标志,从环境变量COOKIE_SECURE控制
- HTTPS环境设置为true
- HTTP环境设置为false
2. 添加sameSite: 'lax'防止CSRF攻击
- lax模式在导航时允许cookie
- 阻止第三方站点的POST请求携带cookie
3. 保留httpOnly: true防止XSS攻击
4. 保留maxAge: 7天的过期时间
配置说明:
- .env中设置 COOKIE_SECURE=true (HTTPS环境)
- .env中设置 COOKIE_SECURE=false (HTTP环境)
影响范围: 用户登录认证cookie安全性
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 13:36:12 +08:00 |
|
|
|
ee555af1a5
|
安全: 优化CORS配置,支持环境变量控制允许的来源
问题描述:
- CORS配置使用origin: true允许所有来源
- 无法限制跨域访问,存在CSRF风险
- 生产环境应该只允许特定域名访问
修复内容:
1. 从环境变量ALLOWED_ORIGINS读取允许的来源列表
2. 支持多个域名配置(逗号分隔)
3. 实现origin验证回调函数
4. 默认允许所有(*),但在生产环境会发出警告
5. 记录并拒绝未授权来源的请求
配置示例:
- 开发环境: ALLOWED_ORIGINS=*
- 生产环境: ALLOWED_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
影响范围: 跨域请求控制
测试建议:
- 配置ALLOWED_ORIGINS后验证只有指定域名可以访问
- 生产环境使用*时应该看到警告日志
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 13:33:38 +08:00 |
|
|
|
9d510afa60
|
安全: 修复密码修改无需验证旧密码的安全漏洞
问题描述:
- 用户修改密码时不需要验证当前密码
- 攻击者获取session后可直接修改密码
- 违反基本的安全最佳实践
修复内容:
1. 添加current_password必填验证
2. 在更新密码前验证当前密码正确性
3. 验证失败返回401错误
4. 更新API文档注释
API变更:
POST /api/user/change-password
请求参数:
- current_password (新增,必填)
- new_password (已有,必填)
影响范围: 用户密码修改功能
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 13:23:18 +08:00 |
|
WanWanYun
|
f097dfd179
|
修复: 将默认上传限制从100MB提升到10GB
- database.js: 修改数据库初始化默认值为10GB (10737418240字节)
- server.js: 修改两处fallback默认值为10GB
- 确保新部署的系统默认支持10GB单文件上传
- 解决用户报告的100MB上传限制问题
版本: v1.2.5
|
2025-11-11 01:57:06 +08:00 |
|
WanWanYun
|
77bb2f7bdc
|
修复: 管理员账号密码无法正确设置的问题
- 在 server.js 开头添加 require('dotenv').config()
- 确保环境变量从 .env 文件正确加载
- 修复了安装时设置的管理员账号密码不生效的问题
版本: v1.2.4
|
2025-11-11 01:50:18 +08:00 |
|
WanWanYun
|
0f133962dc
|
Initial commit - 玩玩云文件管理系统 v1.0.0
- 完整的前后端代码
- 支持本地存储和SFTP存储
- 文件分享功能
- 上传工具源代码
- 完整的部署文档
- Nginx配置模板
技术栈:
- 后端: Node.js + Express + SQLite
- 前端: Vue.js 3 + Axios
- 存储: 本地存储 / SFTP远程存储
|
2025-11-10 21:50:16 +08:00 |
|