@microi.net/cli 5.1.7 → 5.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,66 +1,66 @@
1
1
  ---
2
2
  name: v8-security
3
- description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆业务秘密、Passkey/TOTP/人脸步进验证、接口引擎安全、密钥管理、SQL 注入、匿名端点、文件上传和租户隔离。
3
+ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆业务秘密、Passkey/TOTP/人脸步进验证、接口引擎安全、密钥管理、SQL 注入、匿名端点、文件上传和租户隔离。
4
4
  ---
5
5
 
6
6
  > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
7
 
8
- # Microi V8 安全最佳实践
9
-
10
- 你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
11
-
12
- 访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
8
+ # Microi V8 安全最佳实践
9
+
10
+ 你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
11
+
12
+ 访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
13
13
 
14
14
  <!-- microi-progressive:begin -->
15
- <!-- microi-progressive:chunk id=v8-security-000 sha256=683f6fb48592b050fc31caec6b45e39c8109b0a67baa48c0a2e6d1385a0e4ce1 -->
16
- ## 0. 租户动态系统设置与密钥边界
17
-
18
- 第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。公开的租户配置必须建成当前租户 `sys_config` 的实体字段;敏感或仅供后端使用的租户业务配置保存到 `mci_system_setting`。数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
15
+ <!-- microi-progressive:chunk id=v8-security-000 sha256=0346bd9ca3fe98dd2b589d1777aa1e55cd24cf7dedc69ee65d4ca91461db7dee -->
16
+ ## 0. 租户动态系统设置与密钥边界
17
+
18
+ 第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。公开的租户配置必须建成当前租户 `sys_config` 的实体字段;敏感或仅供后端使用的租户业务配置保存到 `mci_system_setting`。数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
19
19
 
20
20
  ```javascript
21
- // ✅ 浏览器/前端 V8 只读取 sys_config 的浏览器安全投影
22
- var sysTitle = V8.SysConfig.SysTitle;
23
- var githubVisible = V8.SysConfig.LoginGitHubDisplay;
24
-
25
- // ✅ 后端接口引擎/后端 V8 事件从独立节点读取私密设置
26
- var privateSettings = V8.SysConfig.ServerPrivateSettings || {};
27
- var clientSecret = privateSettings['Login.Gitee.ClientSecret'];
28
- // 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
21
+ // ✅ 浏览器/前端 V8 只读取 sys_config 的浏览器安全投影
22
+ var sysTitle = V8.SysConfig.SysTitle;
23
+ var githubVisible = V8.SysConfig.DisableLoginGitHub !== 1;
24
+
25
+ // ✅ 后端接口引擎/后端 V8 事件从独立节点读取私密设置
26
+ var privateSettings = V8.SysConfig.ServerPrivateSettings || {};
27
+ var clientSecret = privateSettings['Login.Gitee.ClientSecret'];
28
+ // 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
29
29
 
30
30
  // ❌ 危险:密钥泄漏 / 跨租户串号
31
31
  var openaiKey = 'sk-xxxxxxxxxx';
32
32
  ```
33
33
 
34
- `V8.OsClientModel` 与兼容别名 `V8.ClientModel` 均为独立脱敏副本:数据库连接、AuthSecret、Redis、对象存储、MQ、MQTT、Search 的地址与凭据不会注入脚本。存量租户业务字段只作兼容,新增 Secret 不得继续依赖 `V8.OsClientModel`。
35
-
36
- `V8.SysConfig` 按运行端采用不同权限投影,且任何运行端都不存在 `PublicSettings` 属性。浏览器/前端 V8 只得到匿名 `GetSysConfig` 的独立脱敏 `sys_config` 投影;`mci_system_setting` 的任何记录都不会进入浏览器。后端接口引擎和后端 V8 事件得到当前租户完整、独立的 `sys_config`,全部启用的 `mci_system_setting` 则放在 `V8.SysConfig.ServerPrivateSettings`,Secret 由可信后端按租户解密。独立节点避免动态 Key 覆盖 `sys_config` 实体字段,也让前后端边界可审计。子租户调用 `V8.FormEngine.GetSysConfig(...)` 时仍强制使用当前 `OsClient`,不能借缓存命中读取其它租户配置。
37
-
38
- Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher`、`ServerPrivateSettings` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
39
-
40
- 共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
41
-
42
- 子租户缺少 RabbitMQ/MQTT/Search 独立凭据时必须失败关闭,禁止回退主租户账号。新租户开通只有在外部 broker/search 中真实创建 user、vhost、ACL 或 API Key 后,才能标记对应服务可用。
43
-
44
- 登录和管理端必须强制 HTTPS。登录 RSA 只用于避免密码在请求体、代理调试界面中直接显示,不能替代 HTTPS,也不能作为身份认证或密码存储密钥。平台为兼容已发布客户、旧前端和浏览器缓存,保留历史登录 RSA 密钥对作为缺省回退;安全修复不得直接删除该回退并造成全量客户无法登录。需要部署专属密钥时,在主租户 SaaS 引擎【后端运行配置】中成对维护 `BackendLoginRsaPrivateKey` 与 `BackendLoginRsaPublicKey`;私钥只允许可信服务端读取,匿名 `GetSysConfig` 只返回匹配公钥。源码、环境变量、普通 V8、前端业务代码和日志中仍禁止新增或输出真正的业务私钥、JWT 密钥、支付密钥及对象存储凭据。
45
-
46
- 微信内容安全回调固定使用 `/api/wechatcontentsecurity/callback` 或第三方不支持 QueryString 时以 `/api/wechatcontentsecurity/callback--osclient--` 为路径前缀并追加 `{OsClient}--`;回调只能由服务端按签名和租户规则建立信任。
47
-
48
- 吾码现有多端兼容约定是:主 SaaS 引擎 `sys_osclients.CorsAllowOrigins` 为空时默认允许全部跨域,便于本地开发、独立前端、H5 和不同租户域名访问;配置了来源后才按精确来源或通配符限制。安全修复不得把“未配置”改成默认拒绝,否则会造成所有存量部署和本地调试突然失效。CORS 不是鉴权边界,权限仍必须依赖 Token、租户隔离、菜单/表权限和服务端数据范围。
49
-
50
- 吾码既有客户大量通过 `V8.Http` 访问内网设备、InfluxDB、内部 ApiEngine 和本机 sidecar。严格 SSRF 防护必须默认关闭:未配置时不得限制协议、URL 内嵌凭据、回环、私网、链路本地、云元数据或重定向。只有客户在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后才进入严格模式,并用精确 `SsrfAllowedHosts` 放行;不要为这类普通运行参数增加 API 容器环境变量。
51
-
52
- 外部数据库与附件迁移属于更高风险的控制面操作:
53
-
54
- - `microi_database` 只允许 `Level >= 9999` 的可信管理链路维护;连接字符串、密码和鉴权 Header 不得出现在日志、接口返回、前端或审计详情。
55
- - MCP 临时连接和保存连接只接受平台认证数据库类型;保存前测试写连接和独立读连接,写入必须显式确认,返回只包含 DbKey、类型和回读状态。
56
- - `microi_query_external_database` 是默认只读入口;`microi_execute_external_database` 是独立超级管理员入口,后端必须从当前 Token 硬校验 `Level >= 9999`。显式确认后不限制 SQL 类型,可执行数据库账号有权执行的 DML、DDL、存储过程、文件能力和多语句;审计仅保留 SQL 哈希、长度、模式和结果。
57
- - `V8.Dbs.Open` 只能在可信后端代码中使用,连接串来自服务端密钥或管理员配置;禁止把 `V8.Param`、Header 或匿名请求里的连接串直接传入。
58
- - `microi_import_external_attachment` 仅对后端确认的 `Level >= 9999` 当前用户开放,可访问 HTTP/HTTPS、私网、本机绝对路径和 UNC;不设固定 MCP 大小上限并采用流式迁移。源 URL、鉴权 Header、本机/UNC 路径只以哈希进入审计,能力仍受 API 服务账号和目标基础设施授权约束。
59
- - 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
60
-
34
+ `V8.OsClientModel` 与兼容别名 `V8.ClientModel` 均为独立脱敏副本:数据库连接、AuthSecret、Redis、对象存储、MQ、MQTT、Search 的地址与凭据不会注入脚本。存量租户业务字段只作兼容,新增 Secret 不得继续依赖 `V8.OsClientModel`。
35
+
36
+ `V8.SysConfig` 按运行端采用不同权限投影,且任何运行端都不存在 `PublicSettings` 属性。浏览器/前端 V8 只得到匿名 `GetSysConfig` 的独立脱敏 `sys_config` 投影;`mci_system_setting` 的任何记录都不会进入浏览器。后端接口引擎和后端 V8 事件得到当前租户完整、独立的 `sys_config`,全部启用的 `mci_system_setting` 则放在 `V8.SysConfig.ServerPrivateSettings`,Secret 由可信后端按租户解密。独立节点避免动态 Key 覆盖 `sys_config` 实体字段,也让前后端边界可审计。子租户调用 `V8.FormEngine.GetSysConfig(...)` 时仍强制使用当前 `OsClient`,不能借缓存命中读取其它租户配置。
37
+
38
+ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher`、`ServerPrivateSettings` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
39
+
40
+ 共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
41
+
42
+ 子租户缺少 RabbitMQ/MQTT/Search 独立凭据时必须失败关闭,禁止回退主租户账号。新租户开通只有在外部 broker/search 中真实创建 user、vhost、ACL 或 API Key 后,才能标记对应服务可用。
43
+
44
+ 登录和管理端必须强制 HTTPS。登录 RSA 只用于避免密码在请求体、代理调试界面中直接显示,不能替代 HTTPS,也不能作为身份认证或密码存储密钥。平台为兼容已发布客户、旧前端和浏览器缓存,保留历史登录 RSA 密钥对作为缺省回退;安全修复不得直接删除该回退并造成全量客户无法登录。需要部署专属密钥时,在主租户 SaaS 引擎【后端运行配置】中成对维护 `BackendLoginRsaPrivateKey` 与 `BackendLoginRsaPublicKey`;私钥只允许可信服务端读取,匿名 `GetSysConfig` 只返回匹配公钥。源码、环境变量、普通 V8、前端业务代码和日志中仍禁止新增或输出真正的业务私钥、JWT 密钥、支付密钥及对象存储凭据。
45
+
46
+ 微信内容安全回调固定使用 `/api/wechatcontentsecurity/callback` 或第三方不支持 QueryString 时以 `/api/wechatcontentsecurity/callback--osclient--` 为路径前缀并追加 `{OsClient}--`;回调只能由服务端按签名和租户规则建立信任。
47
+
48
+ 吾码现有多端兼容约定是:主 SaaS 引擎 `sys_osclients.CorsAllowOrigins` 为空时默认允许全部跨域,便于本地开发、独立前端、H5 和不同租户域名访问;配置了来源后才按精确来源或通配符限制。安全修复不得把“未配置”改成默认拒绝,否则会造成所有存量部署和本地调试突然失效。CORS 不是鉴权边界,权限仍必须依赖 Token、租户隔离、菜单/表权限和服务端数据范围。
49
+
50
+ 吾码既有客户大量通过 `V8.Http` 访问内网设备、InfluxDB、内部 ApiEngine 和本机 sidecar。严格 SSRF 防护必须默认关闭:未配置时不得限制协议、URL 内嵌凭据、回环、私网、链路本地、云元数据或重定向。只有客户在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后才进入严格模式,并用精确 `SsrfAllowedHosts` 放行;不要为这类普通运行参数增加 API 容器环境变量。
51
+
52
+ 外部数据库与附件迁移属于更高风险的控制面操作:
53
+
54
+ - `microi_database` 只允许 `Level >= 9999` 的可信管理链路维护;连接字符串、密码和鉴权 Header 不得出现在日志、接口返回、前端或审计详情。
55
+ - MCP 临时连接和保存连接只接受平台认证数据库类型;保存前测试写连接和独立读连接,写入必须显式确认,返回只包含 DbKey、类型和回读状态。
56
+ - `microi_query_external_database` 是默认只读入口;`microi_execute_external_database` 是独立超级管理员入口,后端必须从当前 Token 硬校验 `Level >= 9999`。显式确认后不限制 SQL 类型,可执行数据库账号有权执行的 DML、DDL、存储过程、文件能力和多语句;审计仅保留 SQL 哈希、长度、模式和结果。
57
+ - `V8.Dbs.Open` 只能在可信后端代码中使用,连接串来自服务端密钥或管理员配置;禁止把 `V8.Param`、Header 或匿名请求里的连接串直接传入。
58
+ - `microi_import_external_attachment` 仅对后端确认的 `Level >= 9999` 当前用户开放,可访问 HTTP/HTTPS、私网、本机绝对路径和 UNC;不设固定 MCP 大小上限并采用流式迁移。源 URL、鉴权 Header、本机/UNC 路径只以哈希进入审计,能力仍受 API 服务账号和目标基础设施授权约束。
59
+ - 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
60
+
61
61
  <!-- /microi-progressive:chunk -->
62
62
  <!-- microi-progressive:chunk id=v8-security-001 sha256=c5868fd8a159b72f1038658873dfee83a9eca68661eebd837ecadab13dea5c22 -->
63
- ## 0.5 接口引擎配置安全
63
+ ## 0.5 接口引擎配置安全
64
64
 
65
65
  代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
66
66
 
@@ -85,10 +85,10 @@ V8.FormEngine.GetTableData('SysUser', {
85
85
  _PageSize: 20
86
86
  });
87
87
 
88
- // ✅ 必须原生 SQL 时:FromSql 只传 SQL,参数用 AddInParameter
89
- V8.Db.FromSql('SELECT * FROM SysUser WHERE Account = @p0')
90
- .AddInParameter("@p0", V8.Param.account)
91
- .ToArray();
88
+ // ✅ 必须原生 SQL 时:FromSql 只传 SQL,参数用 AddInParameter
89
+ V8.Db.FromSql('SELECT * FROM SysUser WHERE Account = @p0')
90
+ .AddInParameter("@p0", V8.Param.account)
91
+ .ToArray();
92
92
  ```
93
93
 
94
94
  ### 禁止:字符串拼接
@@ -146,26 +146,26 @@ if (isNaN(amount) || amount <= 0 || amount > 999999.99) {
146
146
 
147
147
  <!-- /microi-progressive:chunk -->
148
148
  <!-- microi-progressive:chunk id=v8-security-004 sha256=e811dff8614c24c751291dda271b1574debccf741c0e166790f5324a3d3594ad -->
149
- ## 4. 防 XSS
150
-
151
- 四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
152
-
153
- - 纯文本保存原始业务值,渲染时使用 Vue 文本绑定/`textContent`,不要用 `v-html`;
154
- - URL 只允许明确协议和域名,并通过 URL 解析器校验;
155
- - 富文本使用平台统一 allowlist 清洗器,移除 `script`、事件属性、危险协议、`iframe/object` 等;
156
- - V8 模板经 `v-safe-html` / DOMPurify 清洗,内联 `onclick` 等事件会被移除;交互使用平台按钮/V8 事件,不拼接可执行 HTML;
157
- - CSV、Excel、邮件和日志还要分别处理公式注入、HTML 邮件和日志换行注入。
158
-
159
- ```javascript
160
- var content = String(V8.Param.content || '');
161
- if (content.length > 5000) {
162
- return { Code: 0, Msg: '内容过长' };
163
- }
164
- V8.FormEngine.AddFormData('Comment', {
165
- Content: content,
166
- UserId: V8.CurrentUser.Id
167
- });
168
- ```
149
+ ## 4. 防 XSS
150
+
151
+ 四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
152
+
153
+ - 纯文本保存原始业务值,渲染时使用 Vue 文本绑定/`textContent`,不要用 `v-html`;
154
+ - URL 只允许明确协议和域名,并通过 URL 解析器校验;
155
+ - 富文本使用平台统一 allowlist 清洗器,移除 `script`、事件属性、危险协议、`iframe/object` 等;
156
+ - V8 模板经 `v-safe-html` / DOMPurify 清洗,内联 `onclick` 等事件会被移除;交互使用平台按钮/V8 事件,不拼接可执行 HTML;
157
+ - CSV、Excel、邮件和日志还要分别处理公式注入、HTML 邮件和日志换行注入。
158
+
159
+ ```javascript
160
+ var content = String(V8.Param.content || '');
161
+ if (content.length > 5000) {
162
+ return { Code: 0, Msg: '内容过长' };
163
+ }
164
+ V8.FormEngine.AddFormData('Comment', {
165
+ Content: content,
166
+ UserId: V8.CurrentUser.Id
167
+ });
168
+ ```
169
169
 
170
170
  <!-- /microi-progressive:chunk -->
171
171
  ## 详细参考路由(渐进披露)
@@ -1,134 +1,135 @@
1
- # 后端 V8 API 索引
2
-
3
- 本索引对应接口引擎和后端表单事件。专项 API 的完整模板仍以相应 Skill 为准。
4
-
5
- ## 请求与执行上下文
6
-
7
- | API/变量 | 说明 |
8
- |---|---|
9
- | `V8.Param`、`V8.Header` | URL、Form、JSON 参数与请求头 |
10
- | `V8.CurrentUser` | 当前可信用户;匿名接口可能为空 |
11
- | `V8.OsClient` | 当前租户 |
12
- | `V8.SysConfig` | 系统配置;可能含敏感项,不直接返回 |
13
- | `V8.OsClientModel`、`V8.ClientModel` | 租户配置兼容别名;严禁泄露连接串/密钥 |
14
- | `V8.Form`、`V8.OldForm` | 后端表单事件的新旧数据 |
15
- | `V8.FormSubmitAction` | `Add/Upt/Del` |
16
- | `V8.EventName`、`V8.InvokeType` | 事件名与 Server/Client 调用来源 |
17
- | `V8.TableModel`、`V8.TableData` | 当前表模型/行数据 |
18
- | `V8.RowIndex`、`V8.CacheData`、`V8.NotSaveField` | DataFilter 等事件上下文 |
19
- | `V8.LineValue`、`V8.NextNodeId`、`V8.WF` | 工作流路线与节点上下文 |
20
- | `V8.FilesByteBase64` | 上传文件 Base64 字典 |
21
- | `V8.Limits` | 当前 Jint 资源预算与调用深度 |
22
- | `V8.Action` | 服务器全局 V8 自定义方法 |
23
-
24
- ## 调用、数据与异步
25
-
26
- | API | 说明 |
27
- |---|---|
28
- | `V8.ApiEngine.Run(...)` | 同步调用接口引擎 |
29
- | `await V8.ApiEngine.RunAsync(...)` | 请求内异步调用接口引擎 |
30
- | `V8.FormEngine.*` | 表单 CRUD,见 `v8-crud-api` |
31
- | `await V8.FormEngine.GetTableDataAsync(...)` | 请求内异步查列表 |
32
- | `V8.Db`、`V8.DbRead`、`V8.DbTrans` | 主库、只读库、共享事务 |
33
- | `V8.DbTrans.FromSql(sql)` | 在平台提供的共享事务内执行参数化 SQL |
34
- | `V8.Dbs`、`V8.Dbs.Open(...)` | 已配置的扩展数据库 |
35
- | `V8.MongoDb.*` | MongoDB CRUD |
36
- | `V8.DataSourceEngine` | 当前租户数据源引擎对象 |
37
- | `V8.DataSourceEngine.Run(...)`、`V8.DataSourceEngine.RunAsync(...)` | 同步/请求内异步运行数据源 |
38
- | `V8.ModuleEngine` | 后端模块模型能力;不能绕过用户模块权限 |
39
- | `V8.ModuleEngine.GetTableData(...)` | 按 `ModuleEngineKey` 应用模块关联表配置查询 |
40
-
41
- 接口引擎返回后宿主上下文会释放。只在真实 `*Async` 方法上使用 `await`;
42
- 脱离请求的工作使用后台任务、Job、MQ 或 outbox。
43
-
44
- ## V8.Method
45
-
46
- | API | 说明 |
47
- |---|---|
48
- | `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
49
- | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
50
- | `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
51
- | `V8.Method.RefreshLoginUser(userId,osClient)` | 刷新用户登录缓存 |
52
- | `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |
53
- | `V8.Method.ConsumeIdentityVerificationTicket({Ticket,Purpose,ActionHash})` | 按当前 DiyToken 用户、租户、用途和操作摘要原子消费一次性 Passkey/TOTP/人脸票据 |
54
- | `V8.Method.GetPrivateFileUrl({FilePathName})` | 签发当前租户短期私有文件代理地址 |
55
- | `V8.Method.Upload(options)` | 受配额限制的上传 |
56
- | `V8.Method.AddSysLog(options)` | 结构化系统日志 |
57
- | `V8.Method.ParseWhere(where)` | 兼容旧 Where 转换 |
58
- | `V8.Method.UpdateBackgroundTask(options)` | 上报已提交单位的后台任务进度 |
59
- | `V8.Method.RefreshExtensionDatabases(osClient?)` | 配置表提交后刷新全节点 `V8.Dbs` |
60
-
61
- 管理员维护、备份、清库、缓存连接管理等低层方法即使可见,也不能暴露为普通
62
- 或匿名业务 API。
63
-
64
- ## Base64 与加密
65
-
66
- ```javascript
67
- var encoded = V8.Base64.StringToBase64('吾码');
68
- var decoded = V8.Base64.Base64ToString(encoded);
69
-
70
- var des = V8.EncryptHelper.DESEncode('legacy-value');
71
- var plain = V8.EncryptHelper.DESDecode(des);
72
- var sha1 = V8.EncryptHelper.SHA1('legacy-value');
73
- var sha256 = V8.EncryptHelper.SHA256('text');
74
- var sha512 = V8.EncryptHelper.SHA512('text');
75
- var hex = V8.EncryptHelper.Sha256Hex('text');
76
- var signature = V8.EncryptHelper.HmacSha256(secretFromConfig, payload);
77
- ```
78
-
79
- `V8.EncryptHelper` 是后端加密/摘要帮助对象。完整入口:
80
- `V8.EncryptHelper.MD5Encrypt`、`V8.EncryptHelper.SHA1`、
81
- `V8.EncryptHelper.SHA256`、`V8.EncryptHelper.SHA512`、
82
- `V8.EncryptHelper.Sha256Hex`、`V8.EncryptHelper.HmacSha256`、
83
- `V8.EncryptHelper.AESEncrypt`、`V8.EncryptHelper.AESDecrypt`、
84
- `V8.EncryptHelper.DESEncode`、`V8.EncryptHelper.DESDecode`。
85
-
86
- DES 只用于明确要求取回原文的兼容业务秘密;保存和显示都在可信后端完成,列表掩码、独立授权、`no-store` 且审计不含明文。登录密码不使用摘要或可逆加密的新设计,完整分级见 `v8-security/SKILL.md`。
87
-
88
- MD5/SHA1 仅为兼容摘要;任何摘要都不能直接作为新密码存储方案。AES/DES/HMAC
89
- 密钥从受控配置读取,不硬编码、不写日志、不返回客户端。
90
-
91
- ## 内置与自定义扩展
92
-
93
- `V8.Alipay`、`V8.AlipayV3`、`V8.WeChat`、`V8.Alidns`、`V8.System`、
94
- `V8.Image` 和 `V8.Tcp` 由当前 `Microi.V8Engine/V8Extend.cs` 注册。扩展可被裁剪或二次
95
- 开发,调用前以目标部署源码和编辑器定义为准。
96
-
97
- - `V8.Alipay.CreatePay(...)` 创建支付宝支付参数;
98
- `V8.Alipay.Test22(...)` 是历史诊断方法,不能作为生产业务接口。
99
- - `V8.WeChat` 当前包含签名、授权头与 AES-GCM 解密等微信支付帮助方法。
100
- - 自定义扩展通过 `V8ExtensionRegistry.Register(name,factory)` 注册为
101
- `V8.<name>`;不要把某个客户的扩展名写成全平台标准能力。
102
-
103
- 支付/微信/DNS 扩展必须只读取当前租户受控凭据,调用前校验权限、金额、订单状态、
104
- 幂等键和回调签名;私钥、Secret 和原始签名材料不得进入日志或响应。
105
-
106
- ## 其它后端扩展
107
-
108
- | 能力 | API |
109
- |---|---|
110
- | 缓存 | `V8.Cache.Set/Get/Remove/Exists/KeyExist/HashSet/HashGet/HashGetAll/HashDelete/HashIncrement` |
111
- | HTTP | `V8.Http.Get/Post/Patch`、`GetResponse/PostResponse/PatchResponse` 及真实 `*Async` 版本 |
112
- | TCP | `V8.Tcp.Send/SendAsync/SendAndReceive/SendAndReceiveAsync`;原始字节与出站安全见 `v8-tcp-integration` |
113
- | 图片 | `V8.Image.Create/Merge/Overlay/Watermark/Resize/Crop/Rotate/Flip/Draw/Convert/GetInfo/CreateQRCode` |
114
- | Office | `V8.Office.ExportExcel/ExcelToList/ExportWord/ExportPowerPoint/SendEmail` |
115
- | OCR | `await V8.OCR.Recognize({...})`;服务端租户配置与调用参数隔离,详见 `ocr-engine` |
116
- | 文件 | `V8.HDFS`、`V8.Method.Upload/GetPrivateFileUrl` |
117
- | MQ | `V8.MQ.SendMsg` |
118
- | 短信 | `V8.Sms.Send` |
119
- | 翻译 | `V8.TranslateEngine.Translate` 与语言缓存方法 |
120
- | 爬虫 | `V8.Spider` |
121
- | 主机监控 | `V8.System`,仅管理员/运维 |
122
- | 工作流 | `V8.WFEngine`、事件中的 `V8.WF` |
123
-
124
- ## 全局函数与 CLR 边界
125
-
126
- | 函数 | 说明 |
127
- |---|---|
128
- | `DateNow(format)` | 当前时间字符串 |
129
- | `DateFormat(value,format)` | 格式化日期 |
130
- | `DateAdd(value,unit,amount,format)` | 日期加减 |
131
- | `console.log/error/warn/info` | 服务端日志,必须脱敏限长 |
132
-
133
- 平台能力优先使用 `V8.*`。不要依赖任意全局 `System` CLR 访问;平台还存在
134
- `V8.System` 主机监控对象,两者不是一回事。
1
+ # 后端 V8 API 索引
2
+
3
+ 本索引对应接口引擎和后端表单事件。专项 API 的完整模板仍以相应 Skill 为准。
4
+
5
+ ## 请求与执行上下文
6
+
7
+ | API/变量 | 说明 |
8
+ |---|---|
9
+ | `V8.Param`、`V8.Header` | URL、Form、JSON 参数与请求头 |
10
+ | `V8.CurrentUser` | 当前可信用户;匿名接口可能为空 |
11
+ | `V8.OsClient` | 当前租户 |
12
+ | `V8.SysConfig` | 系统配置;可能含敏感项,不直接返回 |
13
+ | `V8.OsClientModel`、`V8.ClientModel` | 租户配置兼容别名;严禁泄露连接串/密钥 |
14
+ | `V8.Form`、`V8.OldForm` | 后端表单事件的新旧数据 |
15
+ | `V8.FormSubmitAction` | `Add/Upt/Del` |
16
+ | `V8.EventName`、`V8.InvokeType` | 事件名与 Server/Client 调用来源 |
17
+ | `V8.TableModel`、`V8.TableData` | 当前表模型/行数据 |
18
+ | `V8.RowIndex`、`V8.CacheData`、`V8.NotSaveField` | DataFilter 等事件上下文 |
19
+ | `V8.LineValue`、`V8.NextNodeId`、`V8.WF` | 工作流路线与节点上下文 |
20
+ | `V8.FilesByteBase64` | 上传文件 Base64 字典 |
21
+ | `V8.Limits` | 当前 Jint 资源预算与调用深度 |
22
+ | `V8.Action` | 服务器全局 V8 自定义方法 |
23
+
24
+ ## 调用、数据与异步
25
+
26
+ | API | 说明 |
27
+ |---|---|
28
+ | `V8.ApiEngine.Run(...)` | 同步调用接口引擎 |
29
+ | `await V8.ApiEngine.RunAsync(...)` | 请求内异步调用接口引擎 |
30
+ | `V8.FormEngine.*` | 表单 CRUD,见 `v8-crud-api` |
31
+ | `await V8.FormEngine.GetTableDataAsync(...)` | 请求内异步查列表 |
32
+ | `V8.Db`、`V8.DbRead`、`V8.DbTrans` | 主库、只读库、共享事务 |
33
+ | `V8.DbTrans.FromSql(sql)` | 在平台提供的共享事务内执行参数化 SQL |
34
+ | `V8.Dbs`、`V8.Dbs.Open(...)` | 已配置的扩展数据库 |
35
+ | `V8.MongoDb.*` | MongoDB CRUD |
36
+ | `V8.DataSourceEngine` | 当前租户数据源引擎对象 |
37
+ | `V8.DataSourceEngine.Run(...)`、`V8.DataSourceEngine.RunAsync(...)` | 同步/请求内异步运行数据源 |
38
+ | `V8.ModuleEngine` | 后端模块模型能力;不能绕过用户模块权限 |
39
+ | `V8.ModuleEngine.GetTableData(...)` | 按 `ModuleEngineKey` 应用模块关联表配置查询 |
40
+
41
+ 接口引擎返回后宿主上下文会释放。只在真实 `*Async` 方法上使用 `await`;
42
+ 脱离请求的工作使用后台任务、Job、MQ 或 outbox。
43
+
44
+ ## V8.Method
45
+
46
+ | API | 说明 |
47
+ |---|---|
48
+ | `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
49
+ | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
50
+ | `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
51
+ | `V8.Method.RefreshLoginUser(userId,osClient)` | 刷新用户登录缓存 |
52
+ | `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |
53
+ | `V8.Method.GetDirectTableGrantPolicies()` | 读取平台表直连授权策略;仅供可信角色表单事件做最终校验 |
54
+ | `V8.Method.ConsumeIdentityVerificationTicket({Ticket,Purpose,ActionHash})` | 按当前 DiyToken 用户、租户、用途和操作摘要原子消费一次性 Passkey/TOTP/人脸票据 |
55
+ | `V8.Method.GetPrivateFileUrl({FilePathName})` | 签发当前租户短期私有文件代理地址 |
56
+ | `V8.Method.Upload(options)` | 受配额限制的上传 |
57
+ | `V8.Method.AddSysLog(options)` | 结构化系统日志 |
58
+ | `V8.Method.ParseWhere(where)` | 兼容旧 Where 转换 |
59
+ | `V8.Method.UpdateBackgroundTask(options)` | 上报已提交单位的后台任务进度 |
60
+ | `V8.Method.RefreshExtensionDatabases(osClient?)` | 配置表提交后刷新全节点 `V8.Dbs` |
61
+
62
+ 管理员维护、备份、清库、缓存连接管理等低层方法即使可见,也不能暴露为普通
63
+ 或匿名业务 API。
64
+
65
+ ## Base64 与加密
66
+
67
+ ```javascript
68
+ var encoded = V8.Base64.StringToBase64('吾码');
69
+ var decoded = V8.Base64.Base64ToString(encoded);
70
+
71
+ var des = V8.EncryptHelper.DESEncode('legacy-value');
72
+ var plain = V8.EncryptHelper.DESDecode(des);
73
+ var sha1 = V8.EncryptHelper.SHA1('legacy-value');
74
+ var sha256 = V8.EncryptHelper.SHA256('text');
75
+ var sha512 = V8.EncryptHelper.SHA512('text');
76
+ var hex = V8.EncryptHelper.Sha256Hex('text');
77
+ var signature = V8.EncryptHelper.HmacSha256(secretFromConfig, payload);
78
+ ```
79
+
80
+ `V8.EncryptHelper` 是后端加密/摘要帮助对象。完整入口:
81
+ `V8.EncryptHelper.MD5Encrypt`、`V8.EncryptHelper.SHA1`、
82
+ `V8.EncryptHelper.SHA256`、`V8.EncryptHelper.SHA512`、
83
+ `V8.EncryptHelper.Sha256Hex`、`V8.EncryptHelper.HmacSha256`、
84
+ `V8.EncryptHelper.AESEncrypt`、`V8.EncryptHelper.AESDecrypt`、
85
+ `V8.EncryptHelper.DESEncode`、`V8.EncryptHelper.DESDecode`。
86
+
87
+ DES 只用于明确要求取回原文的兼容业务秘密;保存和显示都在可信后端完成,列表掩码、独立授权、`no-store` 且审计不含明文。登录密码不使用摘要或可逆加密的新设计,完整分级见 `v8-security/SKILL.md`。
88
+
89
+ MD5/SHA1 仅为兼容摘要;任何摘要都不能直接作为新密码存储方案。AES/DES/HMAC
90
+ 密钥从受控配置读取,不硬编码、不写日志、不返回客户端。
91
+
92
+ ## 内置与自定义扩展
93
+
94
+ `V8.Alipay`、`V8.AlipayV3`、`V8.WeChat`、`V8.Alidns`、`V8.System`、
95
+ `V8.Image` 和 `V8.Tcp` 由当前 `Microi.V8Engine/V8Extend.cs` 注册。扩展可被裁剪或二次
96
+ 开发,调用前以目标部署源码和编辑器定义为准。
97
+
98
+ - `V8.Alipay.CreatePay(...)` 创建支付宝支付参数;
99
+ `V8.Alipay.Test22(...)` 是历史诊断方法,不能作为生产业务接口。
100
+ - `V8.WeChat` 当前包含签名、授权头与 AES-GCM 解密等微信支付帮助方法。
101
+ - 自定义扩展通过 `V8ExtensionRegistry.Register(name,factory)` 注册为
102
+ `V8.<name>`;不要把某个客户的扩展名写成全平台标准能力。
103
+
104
+ 支付/微信/DNS 扩展必须只读取当前租户受控凭据,调用前校验权限、金额、订单状态、
105
+ 幂等键和回调签名;私钥、Secret 和原始签名材料不得进入日志或响应。
106
+
107
+ ## 其它后端扩展
108
+
109
+ | 能力 | API |
110
+ |---|---|
111
+ | 缓存 | `V8.Cache.Set/Get/Remove/Exists/KeyExist/HashSet/HashGet/HashGetAll/HashDelete/HashIncrement` |
112
+ | HTTP | `V8.Http.Get/Post/Patch`、`GetResponse/PostResponse/PatchResponse` 及真实 `*Async` 版本 |
113
+ | TCP | `V8.Tcp.Send/SendAsync/SendAndReceive/SendAndReceiveAsync`;原始字节与出站安全见 `v8-tcp-integration` |
114
+ | 图片 | `V8.Image.Create/Merge/Overlay/Watermark/Resize/Crop/Rotate/Flip/Draw/Convert/GetInfo/CreateQRCode` |
115
+ | Office | `V8.Office.ExportExcel/ExcelToList/ExportWord/ExportPowerPoint/SendEmail` |
116
+ | OCR | `await V8.OCR.Recognize({...})`;服务端租户配置与调用参数隔离,详见 `ocr-engine` |
117
+ | 文件 | `V8.HDFS`、`V8.Method.Upload/GetPrivateFileUrl` |
118
+ | MQ | `V8.MQ.SendMsg` |
119
+ | 短信 | `V8.Sms.Send` |
120
+ | 翻译 | `V8.TranslateEngine.Translate` 与语言缓存方法 |
121
+ | 爬虫 | `V8.Spider` |
122
+ | 主机监控 | `V8.System`,仅管理员/运维 |
123
+ | 工作流 | `V8.WFEngine`、事件中的 `V8.WF` |
124
+
125
+ ## 全局函数与 CLR 边界
126
+
127
+ | 函数 | 说明 |
128
+ |---|---|
129
+ | `DateNow(format)` | 当前时间字符串 |
130
+ | `DateFormat(value,format)` | 格式化日期 |
131
+ | `DateAdd(value,unit,amount,format)` | 日期加减 |
132
+ | `console.log/error/warn/info` | 服务端日志,必须脱敏限长 |
133
+
134
+ 平台能力优先使用 `V8.*`。不要依赖任意全局 `System` CLR 访问;平台还存在
135
+ `V8.System` 主机监控对象,两者不是一回事。