接口已经关了 HTTP,为什么内部调用仍然能执行?

同一台接口引擎有外部入口与内部复用路径;StopHttp 只关闭前者。
摘要| StopHttp 关闭的是外部 Client HTTP 入口,不是把接口引擎本身停用。源码中,V8.ApiEngine.Run 的缺省调用类型是 Server;HTTP 控制器又会在合并请求参数后恢复服务端身份、剥离伪造的内部标记。内部可调用因此是受设计保护的复用路径,但它仍必须接受当前用户、业务状态和数据范围校验。
✦ 先分清“接口停用”和“关闭外部入口”
看到 StopHttp,最容易做出的错误推断是:这段接口引擎已经不能执行。当前 Microi吾码AI 工作区的文档与源码给出的语义更窄——它约束外部 HTTP 的 Client 调用;引擎是否启用,另由 IsEnable 决定。

外部网络门与服务端编排门是两条不同路径。
一句话| IsEnable 回答“引擎是否运行”;StopHttp 回答“外部 HTTP 能否从 Client 入口进来”。不要把两个开关合并成一个概念。
✦ 源码的关键判断只有三行逻辑
核心判断先看 StopHttp 是否开启,再看调用类型是否为 Client。只要不是 Client,就直接不拦截;普通 Client 才进入可信托管协议或持久化后台任务例外检查。
ShouldBlockStopHttp =
StopHttp
AND InvokeType == Client
AND NOT TrustedManagedProtocol
AND NOT CompleteTrustedWorkerEnvelope

StopHttp 是入口策略;InvokeType 决定这次调用处在哪条路径。
边界| 持久化后台任务的例外不是传一个布尔值就能打开:它还要求受保护上下文、任务 Id 对齐和正数 fencing token。
✦ 为什么 V8.ApiEngine.Run 默认仍能执行
服务端接口引擎内部调用 V8.ApiEngine.Run 时,参数没有显式 _InvokeType,源码会补成 Server。随后同一条执行链加载目标引擎,并在 StopHttp 判断处识别到它不是 Client,因此不会被外部 HTTP 门禁挡住。
var result = V8.ApiEngine.Run('inventory-reconcile', {
BatchId: V8.Param.BatchId
});
return result;
这不是绕过,而是服务端组合能力:一个引擎可以把校验、库存、通知拆成小职责,再由受信任的服务端脚本编排。StopHttp 让这些内部能力不必同时暴露成公网端点。

缺省 Server 调用沿内部路径进入目标引擎,而不是重新发起外部 HTTP。
✦ 外部请求不能自己改成 Server
如果浏览器在 JSON 里提交 _InvokeType:"Server"、_CurrentUser 或 _TrustedServerInvocation,会发生什么?控制器在合并 Body、Query、Form 等不可信参数后,会重新写入服务端认证得到的 CurrentUser,移除伪造的内部调用标记,并以动态路由已解析的真实接口覆盖请求体里的 Key 或地址。

可信身份来自宿主,不来自业务参数中的同名字段。
安全含义| “Server 默认可进”不等于“客户端可以自报 Server”。调用类型、当前用户、动态路由和后台任务信任都由服务端恢复或验证。
✦ StopHttp 不是业务授权
内部路径能到达目标引擎,只说明网络入口策略没有阻止它;这一步没有替代角色、菜单、表权限、数据范围、记录状态、幂等或审计。被多个引擎复用的敏感能力,仍应在目标引擎内部基于 V8.CurrentUser 和权威数据重新计算。

网络门禁负责可达性,业务授权负责能否执行具体动作。
- 校验 V8.CurrentUser 是否存在且有目标操作权限。
- 从数据库读取记录当前状态,不相信调用方传来的状态。
- 按租户和数据范围限定查询与更新。
- 为有副作用的动作加入幂等键、事务和审计。
✦ 这次 4/4 测试证明了什么
本轮从当前源码重新构建并筛选运行 ApiEngineInvocationSecurityTests:4 个测试全部通过,失败 0、跳过 0。它覆盖普通 Client 被拦截、完整持久化任务信封被允许、任务 Id 或 fencing token 异常被拦截,以及 Server/关闭策略不受影响。

真实本地测试:当前源码构建后 4/4 通过;TRX 与源码哈希已归档。
不要外推| 4/4 证明这些聚焦控制流用例通过,不代表所有接口引擎、所有租户配置或线上反向代理都已做端到端验收。
✦ 正确设计是两道门,而不是一道总开关
需要只供内部复用的能力时,可以开启 StopHttp,同时保留引擎启用;然后在引擎内部继续做身份、业务状态、数据范围和副作用保护。需要完全停止执行时,则应使用 IsEnable 或下线调用方,而不是期待 StopHttp 承担所有职责。
- 只关闭外部网络入口:检查 StopHttp 与真实 Client 调用。
- 允许内部复用:确认 Server 上下文来自可信执行链,而不是请求参数。
- 完全停止引擎:使用 IsEnable 或移除调用方,不混用入口策略。
- 处理敏感副作用:在目标引擎内部重算身份、状态、数据范围、幂等与审计。

外层控制谁能到达,内层决定到达后能做什么。
结论| StopHttp 关闭外部 Client HTTP,不关闭可信 Server 编排。内部可达不是免授权;越是复用广泛的引擎,越要把权限与状态校验写在自己内部。
本文7张竖版技术图卡背景由AI生成;流程图、矩阵和测试卡片为基于当前工作区源码与真实测试结果的确定性渲染。
更多推荐




所有评论(0)