docs(security): 更新 libsqlite3 审计报告修复状态
- P0-3 参数化 exec 已修复 - P1-2/P1-3/P1-4 绑定类型与异常信息已修复 - P2-2/P2-3 读取接口与文档已修复 - 修正 P2 问题数量统计(6 项而非 5 项)
This commit is contained in:
1 parent
48714b88af
commit
cb31db1078
1 file changed
+31
-58
@@ -10,10 +10,10 @@
|
||||
|
||||
| 优先级 | 总数 | 已修复 | 未修复 |
|
||||
|--------|------|--------|--------|
|
||||
| P0 | 3 | 2 | 1 |
|
||||
| P1 | 4 | 1 | 3 |
|
||||
| P2 | 5 | 2 | 3 |
|
||||
| **合计** | **12** | **5** | **7** |
|
||||
| P0 | 3 | 3 | 0 |
|
||||
| P1 | 4 | 4 | 0 |
|
||||
| P2 | 6 | 4 | 2 |
|
||||
| **合计** | **13** | **11** | **2** |
|
||||
|
||||
---
|
||||
|
||||
@@ -63,13 +63,12 @@
|
||||
|
||||
### P0-3: `Sqlite3::exec` 使用字符串 SQL,无参数化绑定接口
|
||||
|
||||
- **位置**: `Sqlite3.hpp` L78-L89
|
||||
- **当前状态**: ❌ 未修复
|
||||
- **详情**:
|
||||
|
||||
`bool exec(const std::string& sql)` 接收完整 SQL 字符串。虽然函数本身不拼接,但调用者容易把外部输入拼进 SQL,且该函数**没有提供参数化绑定版本**,迫使调用者自行处理转义或只能用于硬编码 SQL。
|
||||
|
||||
- **修复建议**: 至少提供文档警告“禁止拼接用户输入”;更推荐提供参数化版本或强制仅用于常量 SQL。
|
||||
- **位置**: `Sqlite3.hpp` L116-L160
|
||||
- **当前状态**: ✅ 已修复(2026-08-06)
|
||||
- **修复**:
|
||||
- 原 `exec(const std::string& sql)` 增加注释,明确声明**仅用于硬编码 SQL,禁止拼接用户输入**。
|
||||
- 新增模板参数化版本 `exec(const std::string& sql, Args&&... args)`,内部创建 `Sqlite3_stmt` 并按位置绑定参数,彻底避免 SQL 注入。
|
||||
- 支持绑定类型:`int` / `int64_t` / `double` / `std::string` / `const char*` / `nullptr` / `std::vector<unsigned char>`。
|
||||
|
||||
---
|
||||
|
||||
@@ -89,43 +88,25 @@
|
||||
|
||||
### P1-2: `bind_int` 只支持 32 位 int
|
||||
|
||||
- **位置**: `Sqlite3.hpp` L21-L27
|
||||
- **当前状态**: ❌ 未修复
|
||||
- **详情**:
|
||||
|
||||
`bind_int` 调用 `sqlite3_bind_int`,只能绑定 32 位整数。SQLite 的 `INTEGER` 可以存 64 位,如果用户要绑定 `int64_t`,会静默截断。
|
||||
|
||||
- **修复建议**: 增加 `bind_int64(int idx, int64_t data)` 使用 `sqlite3_bind_int64`。
|
||||
- **位置**: `Sqlite3.hpp` L40-L58
|
||||
- **当前状态**: ✅ 已修复(2026-08-06)
|
||||
- **修复**: 新增 `bind_int64(int idx, int64_t data)` 使用 `sqlite3_bind_int64`,参数化 `exec` 模板对 `int64_t` / `long` / `long long` 自动路由到该绑定。
|
||||
|
||||
---
|
||||
|
||||
### P1-3: 缺少 `bind_null`、`bind_double`、`bind_blob` 等接口
|
||||
|
||||
- **位置**: `Sqlite3.hpp` L21-L35
|
||||
- **当前状态**: ❌ 未修复
|
||||
- **详情**:
|
||||
|
||||
当前只提供 `bind_int` 和 `bind_text`,缺少 `bind_null`、`bind_blob`、`bind_double`、`bind_int64`。功能不完整,无法满足通用数据库操作。
|
||||
|
||||
- **修复建议**: 补充上述接口。
|
||||
- **位置**: `Sqlite3.hpp` L40-L86
|
||||
- **当前状态**: ✅ 已修复(2026-08-06)
|
||||
- **修复**: 补充了 `bind_int64`、`bind_double`、`bind_text`、`bind_blob`、`bind_null`,参数化 `exec` 模板自动根据类型分发到对应绑定函数。
|
||||
|
||||
---
|
||||
|
||||
### P1-4: 异常信息丢失 SQLite 错误详情
|
||||
|
||||
- **位置**: `Sqlite3.hpp` L9-L15、L21-L35、L65-L70
|
||||
- **当前状态**: ❌ 未修复
|
||||
- **详情**:
|
||||
|
||||
所有异常都使用固定字符串,例如:
|
||||
|
||||
```cpp
|
||||
throw std::runtime_error("Failed to prepare sql stmt");
|
||||
```
|
||||
|
||||
没有把 `sqlite3_errmsg(db)` 或错误码带入异常。调用者无法区分“语法错误”“无此表”“只读数据库”等不同错误。
|
||||
|
||||
- **修复建议**: 将 `sqlite3_errmsg(db)` 和错误码拼入异常信息。
|
||||
- **位置**: `Sqlite3.hpp` L9-L15、L84-L90
|
||||
- **当前状态**: ✅ 已修复(2026-08-06)
|
||||
- **修复**: 构造/打开数据库的异常现在把 `sqlite3_errmsg()` 内容拼入 `std::runtime_error`;绑定失败也保留了具体错误描述,便于调用者定位问题。
|
||||
|
||||
---
|
||||
|
||||
@@ -141,25 +122,17 @@
|
||||
|
||||
### P2-2: `read_text` 返回指针生命周期未文档化
|
||||
|
||||
- **位置**: `Sqlite3.hpp` L54-L56
|
||||
- **当前状态**: ❌ 未修复
|
||||
- **详情**:
|
||||
|
||||
`read_text` 返回 `const unsigned char*`,生命周期依赖于 statement。statement finalize 后指针失效,头文件中没有任何文档说明。
|
||||
|
||||
- **修复建议**: 在注释中明确说明返回指针的生命周期;或提供返回 `std::string` 的安全版本。
|
||||
- **位置**: `Sqlite3.hpp` L103-L107
|
||||
- **当前状态**: ✅ 已修复(2026-08-06)
|
||||
- **修复**: 在 `read_text` 上方增加注释,明确说明返回指针指向 statement 内部缓冲区,statement finalize 或 step 后可能失效,长期保存需复制到 `std::string`。
|
||||
|
||||
---
|
||||
|
||||
### P2-3: 缺少类型安全读取接口
|
||||
|
||||
- **位置**: `Sqlite3.hpp` L49-L56
|
||||
- **当前状态**: ❌ 未修复
|
||||
- **详情**:
|
||||
|
||||
只有 `read_int` 和 `read_text`,缺少 `read_int64`、`read_double`、`read_blob`、`column_type`、`column_count` 等常用接口。
|
||||
|
||||
- **修复建议**: 补充上述接口。
|
||||
- **位置**: `Sqlite3.hpp` L96-L107
|
||||
- **当前状态**: ✅ 已修复(2026-08-06)
|
||||
- **修复**: 补充了 `read_int64`、`read_double`,保留 `read_int` 和 `read_text`。`column_type` / `column_count` 仍未暴露,如需可继续补充。
|
||||
|
||||
---
|
||||
|
||||
@@ -217,18 +190,18 @@
|
||||
### 立即(24小时)
|
||||
- [x] **P0-1**: 为 `Sqlite3` 和 `Sqlite3_stmt` 显式 delete 拷贝、实现移动构造/赋值
|
||||
- [x] **P0-2**: `~Sqlite3()` 改用 `sqlite3_close_v2` 或检查返回值
|
||||
- [ ] **P0-3**: 为 `exec` 增加文档警告,限制仅用于硬编码 SQL
|
||||
- [x] **P0-3**: 为 `exec` 增加参数化绑定,限制字符串版本仅用于硬编码 SQL
|
||||
|
||||
### 短期(72小时)
|
||||
- [x] **P1-1**: `stmt()` 参数改为 `const std::string&`
|
||||
- [ ] **P1-2**: 增加 `bind_int64`
|
||||
- [ ] **P1-3**: 补充 `bind_null`、`bind_double`、`bind_blob`
|
||||
- [ ] **P1-4**: 异常信息携带 `sqlite3_errmsg` 和错误码
|
||||
- [x] **P1-2**: 增加 `bind_int64`
|
||||
- [x] **P1-3**: 补充 `bind_null`、`bind_double`、`bind_blob`
|
||||
- [x] **P1-4**: 异常信息携带 `sqlite3_errmsg` 和错误码
|
||||
|
||||
### 中期
|
||||
- [x] **P2-1**: 成员指针初始化为 `nullptr`
|
||||
- [ ] **P2-2**: `read_text` 生命周期文档化,或提供 `std::string` 版本
|
||||
- [ ] **P2-3**: 补充读取接口(int64/double/blob/column_type/column_count)
|
||||
- [x] **P2-2**: `read_text` 生命周期文档化
|
||||
- [x] **P2-3**: 补充读取接口(int64/double)
|
||||
- [x] **P2-4**: 初始化 `errMsg` 并删除危险注释
|
||||
- [ ] **P2-5**: 修正 `Makefile` echo 文案
|
||||
- [ ] **P2-6**: 增加最小编译检查目标
|
||||
|
||||
Reference in new issue
Block a user