mirror of
https://github.com/zhinianboke/xianyu-auto-reply.git
synced 2025-08-02 12:37:35 +08:00
7.0 KiB
7.0 KiB
多用户数据隔离完整分析报告
🚨 发现的问题
经过全面检查,发现以下模块缺乏用户隔离:
❌ 完全未隔离的模块
1. 卡券管理
- 数据库表:
cards
表没有user_id
字段 - API接口: 所有卡券接口都是全局共享
- 影响: 所有用户共享同一套卡券库
2. 自动发货规则
- 数据库表:
delivery_rules
表没有user_id
字段 - API接口: 所有发货规则接口都是全局共享
- 影响: 所有用户共享同一套发货规则
3. 通知渠道
- 数据库表:
notification_channels
表没有user_id
字段 - API接口: 所有通知渠道接口都是全局共享
- 影响: 所有用户共享同一套通知渠道
4. 系统设置
- 数据库表:
system_settings
表没有用户区分 - API接口: 系统设置接口是全局的
- 影响: 所有用户共享系统设置(包括主题颜色等)
⚠️ 部分隔离的模块
5. 商品管理
- 已隔离: 主要CRUD接口
- 未隔离: 批量操作接口
- 影响: 部分功能存在数据泄露风险
6. 消息通知
- 已隔离: 主要配置接口
- 未隔离: 删除操作接口
- 影响: 删除操作可能影响其他用户
📊 详细分析
1. 卡券管理模块
当前状态
-- 当前表结构(无用户隔离)
CREATE TABLE cards (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
type TEXT NOT NULL,
api_config TEXT,
text_content TEXT,
data_content TEXT,
description TEXT,
enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-- 缺少 user_id 字段!
);
未隔离的接口
GET /cards
- 返回所有卡券POST /cards
- 创建卡券(未绑定用户)GET /cards/{card_id}
- 获取卡券详情PUT /cards/{card_id}
- 更新卡券DELETE /cards/{card_id}
- 删除卡券
安全风险
- 用户A可以看到用户B创建的卡券
- 用户A可以修改/删除用户B的卡券
- 卡券数据完全暴露
2. 自动发货规则模块
当前状态
-- 当前表结构(无用户隔离)
CREATE TABLE delivery_rules (
id INTEGER PRIMARY KEY AUTOINCREMENT,
keyword TEXT NOT NULL,
card_id INTEGER NOT NULL,
delivery_count INTEGER DEFAULT 1,
enabled BOOLEAN DEFAULT TRUE,
description TEXT,
delivery_times INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (card_id) REFERENCES cards(id)
-- 缺少 user_id 字段!
);
未隔离的接口
GET /delivery-rules
- 返回所有发货规则POST /delivery-rules
- 创建发货规则(未绑定用户)GET /delivery-rules/{rule_id}
- 获取规则详情PUT /delivery-rules/{rule_id}
- 更新规则DELETE /delivery-rules/{rule_id}
- 删除规则
安全风险
- 用户A可以看到用户B的发货规则
- 用户A可以修改用户B的发货配置
- 可能导致错误的自动发货
3. 通知渠道模块
当前状态
-- 当前表结构(无用户隔离)
CREATE TABLE notification_channels (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
type TEXT NOT NULL,
config TEXT NOT NULL,
enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-- 缺少 user_id 字段!
);
未隔离的接口
GET /notification-channels
- 返回所有通知渠道POST /notification-channels
- 创建通知渠道GET /notification-channels/{channel_id}
- 获取渠道详情PUT /notification-channels/{channel_id}
- 更新渠道DELETE /notification-channels/{channel_id}
- 删除渠道
安全风险
- 用户A可以看到用户B的通知配置
- 用户A可以修改用户B的通知渠道
- 通知可能发送到错误的接收者
4. 系统设置模块
当前状态
-- 当前表结构(全局设置)
CREATE TABLE system_settings (
key TEXT PRIMARY KEY,
value TEXT,
description TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-- 没有用户区分!
);
未隔离的接口
GET /system-settings
- 获取系统设置PUT /system-settings/password
- 更新管理员密码PUT /system-settings/{key}
- 更新系统设置
安全风险
- 所有用户共享系统设置
- 主题颜色等个人偏好无法独立设置
- 可能存在权限提升风险
🔧 修复方案
方案A: 完全用户隔离(推荐)
1. 数据库结构修改
-- 为所有表添加 user_id 字段
ALTER TABLE cards ADD COLUMN user_id INTEGER REFERENCES users(id);
ALTER TABLE delivery_rules ADD COLUMN user_id INTEGER REFERENCES users(id);
ALTER TABLE notification_channels ADD COLUMN user_id INTEGER REFERENCES users(id);
-- 创建用户设置表
CREATE TABLE user_settings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
key TEXT NOT NULL,
value TEXT,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(user_id, key)
);
2. API接口修改
- 所有接口添加用户权限验证
- 数据查询添加用户过滤条件
- 创建操作自动绑定当前用户
3. 数据迁移
- 将现有数据绑定到admin用户
- 提供数据迁移脚本
方案B: 混合隔离策略
1. 用户隔离模块
- 卡券管理: 完全用户隔离
- 自动发货规则: 完全用户隔离
2. 全局共享模块
- 通知渠道: 保持全局共享(管理员配置)
- 系统设置: 区分全局设置和用户设置
🚀 实施计划
阶段1: 数据库结构升级
- 创建数据库迁移脚本
- 添加用户隔离字段
- 创建用户设置表
- 数据迁移和验证
阶段2: API接口修复
- 修复卡券管理接口
- 修复自动发货规则接口
- 修复通知渠道接口(如选择隔离)
- 创建用户设置接口
阶段3: 测试和验证
- 单元测试
- 集成测试
- 安全测试
- 性能测试
阶段4: 文档和部署
- 更新API文档
- 更新用户手册
- 部署和监控
📋 优先级建议
高优先级(安全风险)
- 卡券管理 - 直接影响业务数据
- 自动发货规则 - 可能导致错误发货
中优先级(功能完整性)
- 通知渠道 - 影响通知准确性
- 用户设置 - 影响用户体验
低优先级(系统管理)
- 系统设置 - 主要影响管理功能
🎯 建议采用方案A
理由:
- 安全性最高 - 完全的数据隔离
- 一致性最好 - 所有模块统一的隔离策略
- 扩展性最强 - 便于后续功能扩展
- 维护性最好 - 统一的权限管理模式
实施成本:
- 数据库迁移:中等
- 代码修改:中等
- 测试验证:高
- 总体可控