docs: 研究整理——同步认证迁至 ca 后的过时描述、补 liblogc 与测试清单
- ARCHITECTURE/MODULES:ca 版本 v1.1.0、共享基础库补 liblogc、tests 描述与实际 9 个文件对齐、docs 篇数 57 - core README/报告/HttpTask 注释:管理员鉴权由"gateway 唯一权威"更正为 ca(v0.9.0 认证迁址后描述滞后) - ca/gateway README 架构图 static:9200 → fsys:9200、db:8005 → db2:8005 - 主 README 与 blackbox README 补 test_core_confs.py,test_gateway 文档更新为 ca:8443 契约
This commit is contained in:
1 parent
7467e7bd42
commit
da8ebbf9e6
10 files changed
+27
-23
No files matched your search
@@ -307,6 +307,7 @@
|
|||||||
| `test_waf.py` | waf | coraza 规则匹配与拦截(SQLi/XSS/命令注入/路径遍历/扫描器)、正常请求放行 |
|
| `test_waf.py` | waf | coraza 规则匹配与拦截(SQLi/XSS/命令注入/路径遍历/扫描器)、正常请求放行 |
|
||||||
| `test_dnfs.py` | dnfs2 | 节点树 CRUD、AI 审核集成 |
|
| `test_dnfs.py` | dnfs2 | 节点树 CRUD、AI 审核集成 |
|
||||||
| `test_captcha.py` / `test_smtp.py` / `test_ai_review.py` / `test_static.py` | captcha2 / smtp / ai_review / fsys | 验证码一次性消费、邮件验证码、内容审核纠偏、文件浏览与视频流 |
|
| `test_captcha.py` / `test_smtp.py` / `test_ai_review.py` / `test_static.py` | captcha2 / smtp / ai_review / fsys | 验证码一次性消费、邮件验证码、内容审核纠偏、文件浏览与视频流 |
|
||||||
|
| `test_core_confs.py` | core(内嵌 confs) | confs get/list/reload/health 与 Python 版基线行为对比 |
|
||||||
|
|
||||||
- 默认使用 `tests/blackbox/config.py` 中的生产地址(127.0.0.1,条目名映射见该文件),运行方式见 [tests/blackbox/README.md](tests/blackbox/README.md)。
|
- 默认使用 `tests/blackbox/config.py` 中的生产地址(127.0.0.1,条目名映射见该文件),运行方式见 [tests/blackbox/README.md](tests/blackbox/README.md)。
|
||||||
- 注册测试会创建真实数据库记录,测试完成后可手动清理。
|
- 注册测试会创建真实数据库记录,测试完成后可手动清理。
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ UniServe Framework 的中央认证服务(Central Auth),C++20 实现,v1.0
|
|||||||
## 拓扑定位(waf → ca → gateway 前置拓扑)
|
## 拓扑定位(waf → ca → gateway 前置拓扑)
|
||||||
|
|
||||||
```
|
```
|
||||||
客户端 ──HTTPS──▶ waf:443 (终止 TLS + coraza 规则) ──HTTP──▶ ca:8443 (认证+前置转发) ──HTTP──▶ gateway:8445 (纯转发) ──▶ static:9200 / dnfs2:8006 / core:5200
|
客户端 ──HTTPS──▶ waf:443 (终止 TLS + coraza 规则) ──HTTP──▶ ca:8443 (认证+前置转发) ──HTTP──▶ gateway:8445 (纯转发) ──▶ fsys:9200 / dnfs2:8006 / core:5200
|
||||||
```
|
```
|
||||||
|
|
||||||
- CA 接管原 gateway 的 **8443** 端口,WAF upstream 配置不变(`waf/config.yaml` 仍指向 8443)。
|
- CA 接管原 gateway 的 **8443** 端口,WAF upstream 配置不变(`waf/config.yaml` 仍指向 8443)。
|
||||||
|
|||||||
+1
-1
@@ -111,7 +111,7 @@ PMC 把所有常驻能力抽象为 `ITask`,用 `libth` 的 `Thread`(带 `sto
|
|||||||
|
|
||||||
- 仅监听 `127.0.0.1:5200`,纯 HTTP(WAF 已终止 TLS,无证书)。
|
- 仅监听 `127.0.0.1:5200`,纯 HTTP(WAF 已终止 TLS,无证书)。
|
||||||
- 三个 POST 路由:`/list` `/exec` `/kill`,返回 `{"success", "message", "data"}`。
|
- 三个 POST 路由:`/list` `/exec` `/kill`,返回 `{"success", "message", "data"}`。
|
||||||
- **管理员鉴权**(`verify_admin_token`):每个操作都先调 `gateway /admin/verify`(gateway 是 Token 签发/验签唯一权威,RSA 验签 + is_admin + 过期检查),`Authorization` 头优先、回退 `q4_token` Cookie;gateway 地址由 `GATEWAY_HOST`/`GATEWAY_PORT` 配置(默认 `127.0.0.1:8443`)。gateway 不可用或异常一律 `fail-closed` 返回 401。
|
- **管理员鉴权**(`verify_admin_token`):每个操作都先调 `ca /admin/verify`(认证 v0.9.0 起由 gateway 迁至 ca,RSA 验签 + is_admin + 过期检查),`Authorization` 头优先、回退 `q4_token` Cookie;ca 地址由 `GATEWAY_HOST`/`GATEWAY_PORT` 环境变量配置(沿用旧名,默认 `127.0.0.1:8443`)。ca 不可用或异常一律 `fail-closed` 返回 401。
|
||||||
- 命令执行(`exec`)与 pid 解析同时支持 query 参数与 JSON body。
|
- 命令执行(`exec`)与 pid 解析同时支持 query 参数与 JSON body。
|
||||||
|
|
||||||
## 内嵌 confs 配置服务(v0.1.0 起)
|
## 内嵌 confs 配置服务(v0.1.0 起)
|
||||||
|
|||||||
@@ -152,10 +152,10 @@ namespace process_http_server {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 管理员验证:调用 gateway 的 /admin/verify 验签端点,验证请求携带的 Token 是否为有效管理员。
|
/* 管理员验证:调用 ca 的 /admin/verify 验签端点,验证请求携带的 Token 是否为有效管理员。
|
||||||
* gateway 是 Token 签发与验证的唯一权威(RSA 验签 + is_admin + 过期检查)。
|
* ca 是 Token 签发与验证的唯一权威(RSA 验签 + is_admin + 过期检查,v0.9.0 起由 gateway 迁至 ca)。
|
||||||
* gateway 地址由环境变量 GATEWAY_HOST/GATEWAY_PORT 配置,默认 127.0.0.1:8443。
|
* ca 地址由环境变量 GATEWAY_HOST/GATEWAY_PORT 配置(沿用旧名),默认 127.0.0.1:8443。
|
||||||
* gateway 不可用或响应异常一律视为未授权(fail-closed)。 */
|
* ca 不可用或响应异常一律视为未授权(fail-closed)。 */
|
||||||
static bool verify_admin_token(const http::request<http::string_body>& req) {
|
static bool verify_admin_token(const http::request<http::string_body>& req) {
|
||||||
try {
|
try {
|
||||||
/* 提取 Token:Authorization 头优先,回退 Cookie */
|
/* 提取 Token:Authorization 头优先,回退 Cookie */
|
||||||
@@ -173,7 +173,7 @@ namespace process_http_server {
|
|||||||
}
|
}
|
||||||
if (raw.empty() || raw.substr(0, 7) != "Bearer ") return false;
|
if (raw.empty() || raw.substr(0, 7) != "Bearer ") return false;
|
||||||
|
|
||||||
/* gateway 地址 */
|
/* ca 地址 */
|
||||||
std::string host = "127.0.0.1";
|
std::string host = "127.0.0.1";
|
||||||
int port = 8443;
|
int port = 8443;
|
||||||
if (const char* h = std::getenv("GATEWAY_HOST")) host = h;
|
if (const char* h = std::getenv("GATEWAY_HOST")) host = h;
|
||||||
@@ -276,7 +276,7 @@ namespace process_http_server {
|
|||||||
res.version(req.version());
|
res.version(req.version());
|
||||||
res.set(http::field::content_type, "application/json");
|
res.set(http::field::content_type, "application/json");
|
||||||
|
|
||||||
/* 管理员认证:调用 gateway 验签,未授权直接拒绝 */
|
/* 管理员认证:调用 ca 验签,未授权直接拒绝 */
|
||||||
if (!verify_admin_token(req)) {
|
if (!verify_admin_token(req)) {
|
||||||
res.result(http::status::unauthorized);
|
res.result(http::status::unauthorized);
|
||||||
res.body() = buildJsonResponse(false, "Unauthorized: admin token required");
|
res.body() = buildJsonResponse(false, "Unauthorized: admin token required");
|
||||||
@@ -311,7 +311,7 @@ namespace process_http_server {
|
|||||||
res.version(req.version());
|
res.version(req.version());
|
||||||
res.set(http::field::content_type, "application/json");
|
res.set(http::field::content_type, "application/json");
|
||||||
|
|
||||||
/* 管理员认证:调用 gateway 验签,未授权直接拒绝 */
|
/* 管理员认证:调用 ca 验签,未授权直接拒绝 */
|
||||||
if (!verify_admin_token(req)) {
|
if (!verify_admin_token(req)) {
|
||||||
res.result(http::status::unauthorized);
|
res.result(http::status::unauthorized);
|
||||||
res.body() = buildJsonResponse(false, "Unauthorized: admin token required");
|
res.body() = buildJsonResponse(false, "Unauthorized: admin token required");
|
||||||
@@ -364,7 +364,7 @@ namespace process_http_server {
|
|||||||
res.version(req.version());
|
res.version(req.version());
|
||||||
res.set(http::field::content_type, "application/json");
|
res.set(http::field::content_type, "application/json");
|
||||||
|
|
||||||
/* 管理员认证:调用 gateway 验签,未授权直接拒绝 */
|
/* 管理员认证:调用 ca 验签,未授权直接拒绝 */
|
||||||
if (!verify_admin_token(req)) {
|
if (!verify_admin_token(req)) {
|
||||||
res.result(http::status::unauthorized);
|
res.result(http::status::unauthorized);
|
||||||
res.body() = buildJsonResponse(false, "Unauthorized: admin token required");
|
res.body() = buildJsonResponse(false, "Unauthorized: admin token required");
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
| **core** | C++20 | 5200 / 8010 | 5200 管理 / 8010 loopback | 进程托管(PMC) + 内嵌 confs 配置服务 | 生产 |
|
| **core** | C++20 | 5200 / 8010 | 5200 管理 / 8010 loopback | 进程托管(PMC) + 内嵌 confs 配置服务 | 生产 |
|
||||||
| **redirect80** | Python | 80 | 0.0.0.0 | HTTP→HTTPS 重定向 | 生产 |
|
| **redirect80** | Python | 80 | 0.0.0.0 | HTTP→HTTPS 重定向 | 生产 |
|
||||||
| **waf** | Go | 443 | 0.0.0.0 | 边缘网关:TLS 终止 + coraza WAF | 生产 |
|
| **waf** | Go | 443 | 0.0.0.0 | 边缘网关:TLS 终止 + coraza WAF | 生产 |
|
||||||
| **ca** | C++20 | 8443 | 127.0.0.1 | 中央认证 + 身份头注入 + 前置转发 | 生产 (v1.0.0) |
|
| **ca** | C++20 | 8443 | 127.0.0.1 | 中央认证 + 身份头注入 + 前置转发 | 生产 (v1.1.0) |
|
||||||
| **gateway** | C++20 | 8445 | 127.0.0.1 | 纯转发反向代理(loopback 强制自检) | 生产 (v0.9.0) |
|
| **gateway** | C++20 | 8445 | 127.0.0.1 | 纯转发反向代理(loopback 强制自检) | 生产 (v0.9.0) |
|
||||||
| **fsys** | C++20 | 9200 | 127.0.0.1 | 前端托管 + dnfs 代理(static 的 C++ 重写) | 生产 |
|
| **fsys** | C++20 | 9200 | 127.0.0.1 | 前端托管 + dnfs 代理(static 的 C++ 重写) | 生产 |
|
||||||
| **dnfs2** | C++20 | 8006 | 127.0.0.1 | 树状笔记 CRUD | 生产(dnfs 的 C++ 重写) |
|
| **dnfs2** | C++20 | 8006 | 127.0.0.1 | 树状笔记 CRUD | 生产(dnfs 的 C++ 重写) |
|
||||||
@@ -170,6 +170,7 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
| libcrypt | C++20 | AES_CBC / RSA / SHA256 / Base64 |
|
| libcrypt | C++20 | AES_CBC / RSA / SHA256 / Base64 |
|
||||||
| libsqlite3 | C++20 | SQLite3 header-only 封装 |
|
| libsqlite3 | C++20 | SQLite3 header-only 封装 |
|
||||||
| libmsg | C++20 | pymsg 协议 C++ 实现(4B 大端长度前缀 + UTF-8 JSON),与 Python pymsg 字节级兼容,提供 RpcClient/RpcServer/AsyncQueue |
|
| libmsg | C++20 | pymsg 协议 C++ 实现(4B 大端长度前缀 + UTF-8 JSON),与 Python pymsg 字节级兼容,提供 RpcClient/RpcServer/AsyncQueue |
|
||||||
|
| liblogc | C++20 | 统一集中式日志客户端(`us/LogC.hpp`,对应 Python `log_client.py`):pymsg/TCP 异步批量写 db2 Logs 表,队列上限 1 万条 + 级别过滤 + fail-safe,C++ 服务共用 |
|
||||||
| libtry | C | 嵌入式脚本解释器(递归下降,中文标识符) |
|
| libtry | C | 嵌入式脚本解释器(递归下降,中文标识符) |
|
||||||
| pymsg | Python | 自研 RPC 基础库(`[4B 大端长度][UTF-8 JSON]`),Python 侧 db/log_client 依赖 |
|
| pymsg | Python | 自研 RPC 基础库(`[4B 大端长度][UTF-8 JSON]`),Python 侧 db/log_client 依赖 |
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -64,6 +64,7 @@
|
|||||||
| libcrypt | C++ | 加密库:`AES_CBC`、`MyRSA`、`SHA256`、`Base64`、`Crypto_Basic` |
|
| libcrypt | C++ | 加密库:`AES_CBC`、`MyRSA`、`SHA256`、`Base64`、`Crypto_Basic` |
|
||||||
| libsqlite3 | C++ | SQLite3 header-only 封装 |
|
| libsqlite3 | C++ | SQLite3 header-only 封装 |
|
||||||
| libmsg | C++ | pymsg 协议 C++ 实现(4B 大端长度前缀 + UTF-8 载荷),`MsgClient/Server`、`RpcClient/Server`、`AsyncQueue`,与 Python pymsg 字节级兼容 |
|
| libmsg | C++ | pymsg 协议 C++ 实现(4B 大端长度前缀 + UTF-8 载荷),`MsgClient/Server`、`RpcClient/Server`、`AsyncQueue`,与 Python pymsg 字节级兼容 |
|
||||||
|
| liblogc | C++ | 统一集中式日志客户端(`us/LogC.hpp`,对应 Python `log_client.py`):pymsg/TCP 异步批量写 db2 Logs 表,队列上限 1 万条 + 级别过滤 + fail-safe,ca/core/gateway/captcha2/smtp3 等 C++ 服务共用 |
|
||||||
| libtry | C | 嵌入式脚本解释器(~741 行),手写递归下降,支持中文标识符,用于嵌入式操作界面 shell |
|
| libtry | C | 嵌入式脚本解释器(~741 行),手写递归下降,支持中文标识符,用于嵌入式操作界面 shell |
|
||||||
| pymsg | Python | 自研 RPC 基础库(`[4B 长度][UTF-8 JSON]`),db 服务端与各 `log_client.py` 的基础依赖(setuptools 包) |
|
| pymsg | Python | 自研 RPC 基础库(`[4B 长度][UTF-8 JSON]`),db 服务端与各 `log_client.py` 的基础依赖(setuptools 包) |
|
||||||
| memdb | C++ | 内存数据库(include/src),内部组件,未在主 README 模块表列出 |
|
| memdb | C++ | 内存数据库(include/src),内部组件,未在主 README 模块表列出 |
|
||||||
@@ -72,8 +73,8 @@
|
|||||||
|
|
||||||
| 模块 | 说明 |
|
| 模块 | 说明 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| tests | 黑盒测试套件(`test_db_*`/`test_gateway_*`/`test_waf_*`/`test_dnfs_*`),子进程 + HTTP 验证,前后自动备份恢复 db |
|
| tests | 黑盒测试套件(`test_db.py`/`test_gateway.py`/`test_waf.py`/`test_dnfs.py`/`test_captcha.py`/`test_smtp.py`/`test_ai_review.py`/`test_static.py`/`test_core_confs.py`),纯标准库 HTTP/TCP 用户旅程模拟,经 `test_runner.py` 统一调度(详见 [tests/blackbox/README.md](../tests/blackbox/README.md)) |
|
||||||
| docs | 文档聚合(security/ 审计、reviews/ 审查、reports/ 分析),41+ 篇 md |
|
| docs | 文档聚合(security/ 审计、reviews/ 审查、reports/ 分析),57 篇 md |
|
||||||
|
|
||||||
## 九、根级构建与部署脚本
|
## 九、根级构建与部署脚本
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ core 把所有常驻能力抽象为 `ITask`,用 `libth` 的 `Thread`(带 `st
|
|||||||
|
|
||||||
- 仅监听 `127.0.0.1:5200`,纯 HTTP(WAF 已终止 TLS,无证书)。
|
- 仅监听 `127.0.0.1:5200`,纯 HTTP(WAF 已终止 TLS,无证书)。
|
||||||
- 三个 POST 路由:`/list` `/exec` `/kill`,返回 `{"success", "message", "data"}`。
|
- 三个 POST 路由:`/list` `/exec` `/kill`,返回 `{"success", "message", "data"}`。
|
||||||
- **管理员鉴权**(`verify_admin_token`):每个操作都先调 `gateway /admin/verify`(gateway 是 Token 签发/验签唯一权威,RSA 验签 + is_admin + 过期检查),Authorization 头优先、回退 `q4_token` Cookie;gateway 地址由 `GATEWAY_HOST`/`GATEWAY_PORT` 配置(默认 `127.0.0.1:8443`)。gateway 不可用或异常一律 `fail-closed` 返回 401。
|
- **管理员鉴权**(`verify_admin_token`):每个操作都先调 `ca /admin/verify`(认证 v0.9.0 起由 gateway 迁至 ca,RSA 验签 + is_admin + 过期检查),Authorization 头优先、回退 `q4_token` Cookie;ca 地址由 `GATEWAY_HOST`/`GATEWAY_PORT` 环境变量配置(沿用旧名,默认 `127.0.0.1:8443`)。ca 不可用或异常一律 `fail-closed` 返回 401。
|
||||||
- 命令执行(`exec`)与 pid 解析同时支持 query 参数与 JSON body。
|
- 命令执行(`exec`)与 pid 解析同时支持 query 参数与 JSON body。
|
||||||
|
|
||||||
## 7. 内嵌配置服务(`ConfsTask` + `ConfigStore`)
|
## 7. 内嵌配置服务(`ConfsTask` + `ConfigStore`)
|
||||||
@@ -98,7 +98,7 @@ core 把所有常驻能力抽象为 `ITask`,用 `libth` 的 `Thread`(带 `st
|
|||||||
2. **`PPool` 用下标而非 pid 索引**:`kill(idx)` 语义不自然,FIXME 仍在。
|
2. **`PPool` 用下标而非 pid 索引**:`kill(idx)` 语义不自然,FIXME 仍在。
|
||||||
3. **内存泄漏 TODO**:`HttpTask`/`ConfsTask` 的 `start()` 获取资源后未确认释放(代码注释标注)。
|
3. **内存泄漏 TODO**:`HttpTask`/`ConfsTask` 的 `start()` 获取资源后未确认释放(代码注释标注)。
|
||||||
4. **`/tmp/pst-*` FIFO 残留**:`subsys_call` 异常路径可能留下管道文件。
|
4. **`/tmp/pst-*` FIFO 残留**:`subsys_call` 异常路径可能留下管道文件。
|
||||||
5. **管理接口强依赖 gateway**:`/admin/verify` 不可用时所有管理操作 fail-closed 拒绝(安全优先,但运维注意 gateway 必须在线)。
|
5. **管理接口强依赖 ca**:`/admin/verify` 不可用时所有管理操作 fail-closed 拒绝(安全优先,但运维注意 ca 必须在线)。
|
||||||
6. **`exec` 命令注入面**:`pmc_mtd::exec` 直接 `boost::process::child(cmd)` 以 shell 执行,仅在已通过管理员鉴权后可用——务必保证鉴权不被绕过。
|
6. **`exec` 命令注入面**:`pmc_mtd::exec` 直接 `boost::process::child(cmd)` 以 shell 执行,仅在已通过管理员鉴权后可用——务必保证鉴权不被绕过。
|
||||||
|
|
||||||
## 10. 上手要点
|
## 10. 上手要点
|
||||||
|
|||||||
+2
-2
@@ -14,13 +14,13 @@ UniServe Framework 的应用层网关,C++20 实现。
|
|||||||
## 信任模型
|
## 信任模型
|
||||||
|
|
||||||
```
|
```
|
||||||
waf:443 ──HTTP──▶ ca:8443 ──(注入 X-Auth-User)──▶ gateway:8445 ──▶ static:9200 / dnfs2:8006 / core:5200
|
waf:443 ──HTTP──▶ ca:8443 ──(注入 X-Auth-User)──▶ gateway:8445 ──▶ fsys:9200 / dnfs2:8006 / core:5200
|
||||||
▲ 安全边界 ▲ 仅 loopback
|
▲ 安全边界 ▲ 仅 loopback
|
||||||
```
|
```
|
||||||
|
|
||||||
- gateway 不持有 RSA 密钥、不验签;身份完全信任 ca 注入的头。
|
- gateway 不持有 RSA 密钥、不验签;身份完全信任 ca 注入的头。
|
||||||
- 因此 **启动强制 loopback 自检**:`Server.address` 非 `127.0.0.1`/`::1`/`localhost` 时拒绝启动(防止误配导致外部直连伪造身份)。
|
- 因此 **启动强制 loopback 自检**:`Server.address` 非 `127.0.0.1`/`::1`/`localhost` 时拒绝启动(防止误配导致外部直连伪造身份)。
|
||||||
- `db:8005` 的 `execute` 路由本就无认证,loopback 信任模型与既有基线一致。
|
- `db2:8005` 的 `execute` 路由本就无认证,loopback 信任模型与既有基线一致。
|
||||||
|
|
||||||
## 接口
|
## 接口
|
||||||
|
|
||||||
|
|||||||
@@ -17,14 +17,15 @@ tests/blackbox/
|
|||||||
├── config.py # 服务地址与端口映射
|
├── config.py # 服务地址与端口映射
|
||||||
├── helpers.py # HTTP/TCP 请求封装 + 断言工具 + 计数器
|
├── helpers.py # HTTP/TCP 请求封装 + 断言工具 + 计数器
|
||||||
├── test_runner.py # 统一入口,--url 自动识别目标服务
|
├── test_runner.py # 统一入口,--url 自动识别目标服务
|
||||||
├── test_gateway.py # 输入校验/Token契约/代理路径安全/限流/CORS(v0.8.0 契约,认证链路待测试钩子)
|
├── test_gateway.py # 输入校验/Token契约/代理路径安全/限流/CORS(目标 ca:8443,认证 happy path 待测试钩子)
|
||||||
├── test_captcha.py # 获取验证码 → 校验 → 一次性消费
|
├── test_captcha.py # 获取验证码 → 校验 → 一次性消费
|
||||||
├── test_smtp.py # 发送邮箱验证码 → 校验
|
├── test_smtp.py # 发送邮箱验证码 → 校验
|
||||||
├── test_dnfs.py # 创建笔记 → 查询 → 更新 → 删除(含内容审核)
|
├── test_dnfs.py # 创建笔记 → 查询 → 更新 → 删除(含内容审核)
|
||||||
├── test_db.py # 日志写入 → 查询 → 统计 → 清理
|
├── test_db.py # 日志写入 → 查询 → 统计 → 清理
|
||||||
├── test_ai_review.py # 内容审核 → 人工反馈纠正
|
├── test_ai_review.py # 内容审核 → 人工反馈纠正
|
||||||
├── test_static.py # 首页加载 → 文件浏览 → 视频流 → 路径遍历防护
|
├── test_static.py # 首页加载 → 文件浏览 → 视频流 → 路径遍历防护
|
||||||
└── test_waf.py # 正常请求通行 → SQLi/XSS/命令注入/路径遍历/扫描器拦截
|
├── test_waf.py # 正常请求通行 → SQLi/XSS/命令注入/路径遍历/扫描器拦截
|
||||||
|
└── test_core_confs.py # core 内嵌 confs(与 Python confs 基线行为对比)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 覆盖的用户旅程
|
## 覆盖的用户旅程
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
gateway 黑盒用户模拟测试(v2 — 对齐 gateway v0.8.0 契约)
|
认证/网关黑盒用户模拟测试(v2 — 目标 ca:8443,原 gateway 认证契约随 v0.9.0 迁至 ca)
|
||||||
|
|
||||||
覆盖范围(P0,无需测试钩子):
|
覆盖范围(P0,无需测试钩子):
|
||||||
A. 输入校验与错误语义(v0.8.0 新契约:/login 强制 CAPTCHA、/register 强制 email_code)
|
A. 输入校验与错误语义(v0.8.0 新契约:/login 强制 CAPTCHA、/register 强制 email_code)
|
||||||
@@ -9,7 +9,7 @@ gateway 黑盒用户模拟测试(v2 — 对齐 gateway v0.8.0 契约)
|
|||||||
E. 速率限制(随机 XFF 隔离限流桶,避免用例互斥)
|
E. 速率限制(随机 XFF 隔离限流桶,避免用例互斥)
|
||||||
F. CORS 预检现状固化 + 错误响应脱敏回归(P0-2/P0-3)
|
F. CORS 预检现状固化 + 错误响应脱敏回归(P0-2/P0-3)
|
||||||
|
|
||||||
已知待修复缺陷(断言目标行为,gateway 修复前会 FAIL):
|
已知待修复缺陷(断言目标行为,ca 修复前会 FAIL):
|
||||||
- A3: 缺失 JSON 字段 → 当前 500,应为 400(场景 A5/A8)
|
- A3: 缺失 JSON 字段 → 当前 500,应为 400(场景 A5/A8)
|
||||||
- A2: 白名单外 Target-Url → 当前 500,应为 403(需有效 Token 才能触达,待测试钩子)
|
- A2: 白名单外 Target-Url → 当前 500,应为 403(需有效 Token 才能触达,待测试钩子)
|
||||||
|
|
||||||
@@ -17,9 +17,9 @@ gateway 黑盒用户模拟测试(v2 — 对齐 gateway v0.8.0 契约)
|
|||||||
captcha2/smtp 测试模式(固定验证码答案钩子),落地前黑盒无法覆盖(P1 清单)。
|
captcha2/smtp 测试模式(固定验证码答案钩子),落地前黑盒无法覆盖(P1 清单)。
|
||||||
|
|
||||||
依赖说明:
|
依赖说明:
|
||||||
- gateway 必须运行,否则全部 SKIP
|
- ca (:8443) 必须运行,否则全部 SKIP
|
||||||
- captcha2 (pymsg:8009) 不在线时 C/E5 段 SKIP(其余用例不受影响)
|
- captcha2 (pymsg:8009) 不在线时 C/E5 段 SKIP(其余用例不受影响)
|
||||||
- static (:9200) 不在线时 D3 段 SKIP
|
- fsys (:9200) 不在线时 D3 段 SKIP
|
||||||
- smtp 不在线不影响本文件(相关用例均为 fail-closed 400 路径)
|
- smtp 不在线不影响本文件(相关用例均为 fail-closed 400 路径)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user