mirror of
https://github.com/zhinianboke/xianyu-auto-reply.git
synced 2025-08-02 20:47:35 +08:00
255 lines
7.0 KiB
Markdown
255 lines
7.0 KiB
Markdown
# 多用户数据隔离完整分析报告
|
||
|
||
## 🚨 发现的问题
|
||
|
||
经过全面检查,发现以下模块**缺乏用户隔离**:
|
||
|
||
### ❌ 完全未隔离的模块
|
||
|
||
#### 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. 卡券管理模块
|
||
|
||
#### 当前状态
|
||
```sql
|
||
-- 当前表结构(无用户隔离)
|
||
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. 自动发货规则模块
|
||
|
||
#### 当前状态
|
||
```sql
|
||
-- 当前表结构(无用户隔离)
|
||
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. 通知渠道模块
|
||
|
||
#### 当前状态
|
||
```sql
|
||
-- 当前表结构(无用户隔离)
|
||
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. 系统设置模块
|
||
|
||
#### 当前状态
|
||
```sql
|
||
-- 当前表结构(全局设置)
|
||
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. 数据库结构修改
|
||
```sql
|
||
-- 为所有表添加 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: 数据库结构升级
|
||
1. 创建数据库迁移脚本
|
||
2. 添加用户隔离字段
|
||
3. 创建用户设置表
|
||
4. 数据迁移和验证
|
||
|
||
### 阶段2: API接口修复
|
||
1. 修复卡券管理接口
|
||
2. 修复自动发货规则接口
|
||
3. 修复通知渠道接口(如选择隔离)
|
||
4. 创建用户设置接口
|
||
|
||
### 阶段3: 测试和验证
|
||
1. 单元测试
|
||
2. 集成测试
|
||
3. 安全测试
|
||
4. 性能测试
|
||
|
||
### 阶段4: 文档和部署
|
||
1. 更新API文档
|
||
2. 更新用户手册
|
||
3. 部署和监控
|
||
|
||
## 📋 优先级建议
|
||
|
||
### 高优先级(安全风险)
|
||
1. **卡券管理** - 直接影响业务数据
|
||
2. **自动发货规则** - 可能导致错误发货
|
||
|
||
### 中优先级(功能完整性)
|
||
3. **通知渠道** - 影响通知准确性
|
||
4. **用户设置** - 影响用户体验
|
||
|
||
### 低优先级(系统管理)
|
||
5. **系统设置** - 主要影响管理功能
|
||
|
||
## 🎯 建议采用方案A
|
||
|
||
**理由**:
|
||
1. **安全性最高** - 完全的数据隔离
|
||
2. **一致性最好** - 所有模块统一的隔离策略
|
||
3. **扩展性最强** - 便于后续功能扩展
|
||
4. **维护性最好** - 统一的权限管理模式
|
||
|
||
**实施成本**:
|
||
- 数据库迁移:中等
|
||
- 代码修改:中等
|
||
- 测试验证:高
|
||
- 总体可控
|