@microi.net/cli 5.7.8 → 5.7.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.
Files changed (191) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/LICENSE +21 -21
  7. package/README.md +71 -71
  8. package/assets/build-meta.json +6 -6
  9. package/assets/feature-matrix.json +138 -138
  10. package/assets/logo.svg +4 -4
  11. package/cordis.patch.yml +1 -1
  12. package/package.json +1 -1
  13. package/scripts/mcp-codex-stdio-adapter.js +0 -0
  14. package/scripts/mcp-server.js +102 -101
  15. package/scripts/microi-cli.js +57 -57
  16. package/scripts/microi-codex-broker.js +450 -450
  17. package/scripts/microi-codex-router.js +0 -0
  18. package/scripts/microi-skills.meta.json +366 -366
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +27 -27
  21. package/skills/README.md +286 -286
  22. package/skills/ai-engine/SKILL.md +265 -265
  23. package/skills/ai-engine/agents/openai.yaml +4 -4
  24. package/skills/ai-platform-governance/SKILL.md +177 -177
  25. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  26. package/skills/app-store/SKILL.md +392 -396
  27. package/skills/app-store/agents/openai.yaml +4 -4
  28. package/skills/business-blueprint/SKILL.md +193 -193
  29. package/skills/datasource-engine/SKILL.md +90 -90
  30. package/skills/datasource-engine/agents/openai.yaml +4 -4
  31. package/skills/dos-orm/references/api-reference.md +229 -229
  32. package/skills/email-engine/SKILL.md +78 -78
  33. package/skills/email-engine/references/v8-email.md +34 -34
  34. package/skills/job-engine/SKILL.md +171 -172
  35. package/skills/job-engine/agents/openai.yaml +4 -4
  36. package/skills/message-notification/SKILL.md +155 -156
  37. package/skills/message-notification/agents/openai.yaml +5 -5
  38. package/skills/message-notification/references/contracts.md +102 -102
  39. package/skills/microi-ai-app-auth.js +652 -652
  40. package/skills/microi-ai-application/SKILL.md +102 -106
  41. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  42. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  43. package/skills/microi-client-frontend/SKILL.md +235 -240
  44. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -144
  45. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +196 -196
  46. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +167 -167
  47. package/skills/microi-codex/SKILL.md +72 -76
  48. package/skills/microi-codex-installer/SKILL.md +225 -223
  49. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  50. package/skills/microi-datasource-mapping/SKILL.md +107 -111
  51. package/skills/microi-db-schema/SKILL.md +175 -175
  52. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  53. package/skills/microi-db-schema/references/core-tables.md +695 -695
  54. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  55. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  56. package/skills/microi-db-schema/references/schema.md +646 -646
  57. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  58. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  59. package/skills/microi-docs-coverage/references/capability-map.md +0 -1
  60. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  61. package/skills/microi-form-engine/SKILL.md +226 -226
  62. package/skills/microi-form-engine/references/component-catalog.md +216 -216
  63. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  64. package/skills/microi-form-layout/SKILL.md +205 -205
  65. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
  66. package/skills/microi-frontend-sdk/SKILL.md +188 -188
  67. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +176 -176
  68. package/skills/microi-left-right-layout/SKILL.md +141 -141
  69. package/skills/microi-microservice/SKILL.md +322 -323
  70. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  71. package/skills/microi-mobile-app-quality/SKILL.md +181 -181
  72. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
  73. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
  74. package/skills/microi-solution-quotation/SKILL.md +78 -78
  75. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  76. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  77. package/skills/microi-sso/references/acceptance.md +49 -49
  78. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  79. package/skills/microi-sso/references/inbound.md +53 -53
  80. package/skills/microi-sso/references/outbound.md +39 -39
  81. package/skills/microi-system-delivery/SKILL.md +134 -134
  82. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
  83. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +189 -189
  84. package/skills/microi-ui/SKILL.md +174 -174
  85. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
  86. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  87. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -225
  88. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -154
  89. package/skills/microi.v8.js +1921 -1921
  90. package/skills/module-engine/SKILL.md +237 -250
  91. package/skills/module-engine/references/module-config.md +204 -204
  92. package/skills/ocr-engine/SKILL.md +113 -113
  93. package/skills/ocr-engine/agents/openai.yaml +4 -4
  94. package/skills/page-engine/SKILL.md +180 -191
  95. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -234
  96. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -60
  97. package/skills/performance-testing/SKILL.md +221 -221
  98. package/skills/playwright-e2e/SKILL.md +197 -197
  99. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -173
  100. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -183
  101. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  102. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  103. package/skills/print-engine/SKILL.md +259 -259
  104. package/skills/production-readonly-audit/SKILL.md +41 -41
  105. package/skills/report-engine/SKILL.md +71 -71
  106. package/skills/report-engine/agents/openai.yaml +4 -4
  107. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  108. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  109. package/skills/search-engine/SKILL.md +75 -75
  110. package/skills/search-engine/agents/openai.yaml +4 -4
  111. package/skills/spider-engine/SKILL.md +190 -190
  112. package/skills/system-observability/SKILL.md +238 -238
  113. package/skills/system-observability/references/memory-incident-triage.md +70 -70
  114. package/skills/translate-engine/SKILL.md +140 -140
  115. package/skills/translate-engine/agents/openai.yaml +4 -4
  116. package/skills/ui-design/SKILL.md +191 -191
  117. package/skills/ui-design/assets/templates/MCI-DESIGN.md +198 -198
  118. package/skills/ui-design/references/design-pattern-library.md +184 -184
  119. package/skills/ui-design/references/mci-design-contract.md +163 -163
  120. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
  121. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +137 -137
  122. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
  123. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
  124. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
  125. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
  126. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
  127. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +117 -117
  128. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  129. package/skills/unity-integration/SKILL.md +155 -155
  130. package/skills/unity-integration/agents/openai.yaml +4 -4
  131. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  132. package/skills/unity-integration/references/sdk-api.md +82 -82
  133. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  134. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  135. package/skills/v8-cache-pattern/SKILL.md +306 -306
  136. package/skills/v8-crud-api/SKILL.md +175 -175
  137. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -226
  138. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
  139. package/skills/v8-debugging/SKILL.md +284 -284
  140. package/skills/v8-explorer-tree/SKILL.md +228 -228
  141. package/skills/v8-export-import/SKILL.md +209 -209
  142. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -211
  143. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  144. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -42
  145. package/skills/v8-file-upload/SKILL.md +256 -263
  146. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +101 -101
  147. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +150 -150
  148. package/skills/v8-formengine-http/SKILL.md +219 -219
  149. package/skills/v8-frontend-events/SKILL.md +178 -178
  150. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  151. package/skills/v8-frontend-events/references/bluetooth-print.md +246 -246
  152. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  153. package/skills/v8-http-integration/SKILL.md +182 -182
  154. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  155. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -44
  156. package/skills/v8-image-processing/SKILL.md +190 -190
  157. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  158. package/skills/v8-image-processing/references/api-reference.md +623 -623
  159. package/skills/v8-menu-buttons/SKILL.md +180 -180
  160. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
  161. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
  162. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -104
  163. package/skills/v8-mongodb/SKILL.md +192 -192
  164. package/skills/v8-mq-mqtt/SKILL.md +175 -176
  165. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  166. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  167. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  168. package/skills/v8-saas-multi-tenant/SKILL.md +219 -219
  169. package/skills/v8-security/SKILL.md +168 -168
  170. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +198 -198
  171. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -158
  172. package/skills/v8-sql-query/SKILL.md +302 -302
  173. package/skills/v8-table-event/SKILL.md +144 -144
  174. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +197 -197
  175. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -46
  176. package/skills/v8-tcp-integration/SKILL.md +147 -147
  177. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  178. package/skills/v8-template-engine/SKILL.md +167 -167
  179. package/skills/v8-utilities/SKILL.md +90 -90
  180. package/skills/v8-utilities/references/client-api-index.md +143 -143
  181. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  182. package/skills/v8-utilities/references/server-api-index.md +188 -188
  183. package/skills/v8-workflow/SKILL.md +216 -243
  184. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
  185. package/skills/vision-engine/SKILL.md +159 -159
  186. package/skills/vision-engine/agents/openai.yaml +4 -4
  187. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  188. package/skills/workspace-conventions/SKILL.md +261 -261
  189. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +208 -208
  190. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +216 -216
  191. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -27
@@ -1,82 +1,82 @@
1
- ---
2
- name: v8-security
3
- description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆业务秘密、Passkey/TOTP/人脸步进验证、接口引擎安全、密钥管理、SQL 注入、匿名端点、文件上传和租户隔离。
4
- ---
5
-
6
- > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
-
8
- # Microi V8 安全最佳实践
9
-
10
- 你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
11
-
1
+ ---
2
+ name: v8-security
3
+ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆业务秘密、Passkey/TOTP/人脸步进验证、接口引擎安全、密钥管理、SQL 注入、匿名端点、文件上传和租户隔离。
4
+ ---
5
+
6
+ > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
+
8
+ # Microi V8 安全最佳实践
9
+
10
+ 你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
11
+
12
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
  官方升级资源属于独立控制面。`get-microi-upgrade-resource` 可以匿名读取固定白名单,但 `Publish/PublishBatch` 必须调用仅绑定该 Managed ApiEngineKey 的 `V8.Method.AuthorizeOfficialResourcePublish()`:固定 `iTdos` 官方租户、拒绝访问密钥会话,并从主库复核当前用户、状态和平台管理员角色。禁止只相信 `V8.CurrentUser.Level`,也禁止把这个可信原子复用于普通接口、租户 Hook 或表单事件;资源校验、SHA 乐观锁、事务行锁、写入及回读仍由 Managed V8 编排。
15
-
16
- <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-security-000 sha256=2e81552d91b61d9d7f96cba1502306e186f0a288d5db8d443c4e524fce748bc9 -->
15
+
16
+ <!-- microi-progressive:begin -->
17
+ <!-- microi-progressive:chunk id=v8-security-000 sha256=2e81552d91b61d9d7f96cba1502306e186f0a288d5db8d443c4e524fce748bc9 -->
18
18
  ## 0. 租户动态系统设置与密钥边界
19
19
 
20
20
  **AI 默认处理路径:** 用户交付第三方 Secret 并授权配置时,优先调用 `microi_manage_server_private_secret`:List 只确认 Key/HasSecret;Save 使用 `confirmExecution=SAVE:<ConfigKey>`,固定 `IsSecret=true / IsPublic=false` 并自动脱敏回读。例如畅捷通使用 `Integration.Changjet.AppSecret`,后端从 `V8.SysConfig.ServerPrivateSettings` 使用。不要仅拒绝硬编码后停止,也不要因为 `OsClientModel` 不暴露密钥而误判服务端 V8 无法调用第三方。工具不提供原文揭示;更换已有 Key 前回读现状,超时只回读、不盲目重写。
21
-
21
+
22
22
  第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。公开的租户配置必须建成当前租户 `sys_config` 的实体字段;敏感或仅供后端使用的租户业务配置保存到 `mci_system_setting`。数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
23
23
 
24
24
  能力是否启用、入口是否显示、公开交互模式等 Bool/Enum 配置即使属于登录或第三方集成,也必须放在 `sys_config`;API Key、ClientSecret、RP ID、Origin、Issuer、Scope、供应商地址等后端参数才放在 `mci_system_setting`。禁止给同一个新配置双写两张表。迁移旧开关时采用“新 `sys_config` 显式值 → 旧私密 Key → 存量安全默认”的只读回退,并从私密设置的列表、保存和删除入口移除旧 Key。
25
-
26
- ```javascript
27
- // ✅ 浏览器/前端 V8 只读取 sys_config 的浏览器安全投影
28
- var sysTitle = V8.SysConfig.SysTitle;
29
- var githubVisible = V8.SysConfig.DisableLoginGitHub !== 1;
30
-
31
- // ✅ 后端接口引擎/后端 V8 事件从独立节点读取私密设置
32
- var privateSettings = V8.SysConfig.ServerPrivateSettings || {};
33
- var clientSecret = privateSettings['Login.Gitee.ClientSecret'];
34
- // 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
35
-
36
- // ❌ 危险:密钥泄漏 / 跨租户串号
37
- var openaiKey = 'sk-xxxxxxxxxx';
38
- ```
39
-
25
+
26
+ ```javascript
27
+ // ✅ 浏览器/前端 V8 只读取 sys_config 的浏览器安全投影
28
+ var sysTitle = V8.SysConfig.SysTitle;
29
+ var githubVisible = V8.SysConfig.DisableLoginGitHub !== 1;
30
+
31
+ // ✅ 后端接口引擎/后端 V8 事件从独立节点读取私密设置
32
+ var privateSettings = V8.SysConfig.ServerPrivateSettings || {};
33
+ var clientSecret = privateSettings['Login.Gitee.ClientSecret'];
34
+ // 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
35
+
36
+ // ❌ 危险:密钥泄漏 / 跨租户串号
37
+ var openaiKey = 'sk-xxxxxxxxxx';
38
+ ```
39
+
40
40
  `V8.OsClientModel` 与兼容别名 `V8.ClientModel` 均为独立脱敏副本:数据库连接、AuthSecret、Redis、对象存储、MQ、MQTT、Search 的地址与凭据不会注入脚本。存量租户业务字段只作兼容,新增 Secret 不得继续依赖 `V8.OsClientModel`。
41
41
 
42
42
  接口引擎需要保存可逆的接口私有密码或 Token 时,使用 `V8.Method.ProtectApiEngineSecret(value)` 写入密文,读取时使用 `V8.Method.UnprotectApiEngineSecret(cipher)`。宿主固定绑定当前 `OsClient + ApiEngineKey`,V8 不能指定租户、Purpose 或密钥;同租户其它接口引擎也不能解密。禁止继续用 `V8.OsClientModel.AuthSecret/DbConn` 自行派生 AES 密钥。列表仍只返回脱敏元数据,解密前仍要校验当前用户、行归属和业务权限,原文不得进入日志、审计或匿名响应。
43
-
44
- `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`,不能借缓存命中读取其它租户配置。
45
-
46
- Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher`、`ServerPrivateSettings` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
47
-
48
- 共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
49
-
50
- 子租户缺少 RabbitMQ/MQTT/Search 独立凭据时必须失败关闭,禁止回退主租户账号。新租户开通只有在外部 broker/search 中真实创建 user、vhost、ACL 或 API Key 后,才能标记对应服务可用。
51
-
52
- 登录和管理端必须强制 HTTPS。登录 RSA 只用于避免密码在请求体、代理调试界面中直接显示,不能替代 HTTPS,也不能作为身份认证或密码存储密钥。平台为兼容已发布客户、旧前端和浏览器缓存,保留历史登录 RSA 密钥对作为缺省回退;安全修复不得直接删除该回退并造成全量客户无法登录。需要部署专属密钥时,在主租户 SaaS 引擎【后端运行配置】中成对维护 `BackendLoginRsaPrivateKey` 与 `BackendLoginRsaPublicKey`;私钥只允许可信服务端读取,匿名 `GetSysConfig` 只返回匹配公钥。源码、环境变量、普通 V8、前端业务代码和日志中仍禁止新增或输出真正的业务私钥、JWT 密钥、支付密钥及对象存储凭据。
53
-
54
- 微信内容安全回调固定使用 `/api/wechatcontentsecurity/callback` 或第三方不支持 QueryString 时以 `/api/wechatcontentsecurity/callback--osclient--` 为路径前缀并追加 `{OsClient}--`;回调只能由服务端按签名和租户规则建立信任。
55
-
56
- 吾码现有多端兼容约定是:主 SaaS 引擎 `sys_osclients.CorsAllowOrigins` 为空时默认允许全部跨域,便于本地开发、独立前端、H5 和不同租户域名访问;配置了来源后才按精确来源或通配符限制。安全修复不得把“未配置”改成默认拒绝,否则会造成所有存量部署和本地调试突然失效。CORS 不是鉴权边界,权限仍必须依赖 Token、租户隔离、菜单/表权限和服务端数据范围。
57
-
58
- 吾码既有客户大量通过 `V8.Http` 访问内网设备、InfluxDB、内部 ApiEngine 和本机 sidecar。严格 SSRF 防护必须默认关闭:未配置时不得限制协议、URL 内嵌凭据、回环、私网、链路本地、云元数据或重定向。只有客户在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后才进入严格模式,并用精确 `SsrfAllowedHosts` 放行;不要为这类普通运行参数增加 API 容器环境变量。
59
-
60
- 外部数据库与附件迁移属于更高风险的控制面操作:
61
-
62
- - `microi_database` 只允许 `Level >= 9999` 的可信管理链路维护;连接字符串、密码和鉴权 Header 不得出现在日志、接口返回、前端或审计详情。
63
- - MCP 临时连接和保存连接只接受平台认证数据库类型;保存前测试写连接和独立读连接,写入必须显式确认,返回只包含 DbKey、类型和回读状态。
64
- - `microi_query_external_database` 是默认只读入口;`microi_execute_external_database` 是独立超级管理员入口,后端必须从当前 Token 硬校验 `Level >= 9999`。显式确认后不限制 SQL 类型,可执行数据库账号有权执行的 DML、DDL、存储过程、文件能力和多语句;审计仅保留 SQL 哈希、长度、模式和结果。
65
- - `V8.Dbs.Open` 只能在可信后端代码中使用,连接串来自服务端密钥或管理员配置;禁止把 `V8.Param`、Header 或匿名请求里的连接串直接传入。
66
- - `microi_import_external_attachment` 仅对后端确认的 `Level >= 9999` 当前用户开放,可访问 HTTP/HTTPS、私网、本机绝对路径和 UNC;不设固定 MCP 大小上限并采用流式迁移。源 URL、鉴权 Header、本机/UNC 路径只以哈希进入审计,能力仍受 API 服务账号和目标基础设施授权约束。
67
- - 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
68
-
69
- <!-- /microi-progressive:chunk -->
43
+
44
+ `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`,不能借缓存命中读取其它租户配置。
45
+
46
+ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher`、`ServerPrivateSettings` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
47
+
48
+ 共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
49
+
50
+ 子租户缺少 RabbitMQ/MQTT/Search 独立凭据时必须失败关闭,禁止回退主租户账号。新租户开通只有在外部 broker/search 中真实创建 user、vhost、ACL 或 API Key 后,才能标记对应服务可用。
51
+
52
+ 登录和管理端必须强制 HTTPS。登录 RSA 只用于避免密码在请求体、代理调试界面中直接显示,不能替代 HTTPS,也不能作为身份认证或密码存储密钥。平台为兼容已发布客户、旧前端和浏览器缓存,保留历史登录 RSA 密钥对作为缺省回退;安全修复不得直接删除该回退并造成全量客户无法登录。需要部署专属密钥时,在主租户 SaaS 引擎【后端运行配置】中成对维护 `BackendLoginRsaPrivateKey` 与 `BackendLoginRsaPublicKey`;私钥只允许可信服务端读取,匿名 `GetSysConfig` 只返回匹配公钥。源码、环境变量、普通 V8、前端业务代码和日志中仍禁止新增或输出真正的业务私钥、JWT 密钥、支付密钥及对象存储凭据。
53
+
54
+ 微信内容安全回调固定使用 `/api/wechatcontentsecurity/callback` 或第三方不支持 QueryString 时以 `/api/wechatcontentsecurity/callback--osclient--` 为路径前缀并追加 `{OsClient}--`;回调只能由服务端按签名和租户规则建立信任。
55
+
56
+ 吾码现有多端兼容约定是:主 SaaS 引擎 `sys_osclients.CorsAllowOrigins` 为空时默认允许全部跨域,便于本地开发、独立前端、H5 和不同租户域名访问;配置了来源后才按精确来源或通配符限制。安全修复不得把“未配置”改成默认拒绝,否则会造成所有存量部署和本地调试突然失效。CORS 不是鉴权边界,权限仍必须依赖 Token、租户隔离、菜单/表权限和服务端数据范围。
57
+
58
+ 吾码既有客户大量通过 `V8.Http` 访问内网设备、InfluxDB、内部 ApiEngine 和本机 sidecar。严格 SSRF 防护必须默认关闭:未配置时不得限制协议、URL 内嵌凭据、回环、私网、链路本地、云元数据或重定向。只有客户在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后才进入严格模式,并用精确 `SsrfAllowedHosts` 放行;不要为这类普通运行参数增加 API 容器环境变量。
59
+
60
+ 外部数据库与附件迁移属于更高风险的控制面操作:
61
+
62
+ - `microi_database` 只允许 `Level >= 9999` 的可信管理链路维护;连接字符串、密码和鉴权 Header 不得出现在日志、接口返回、前端或审计详情。
63
+ - MCP 临时连接和保存连接只接受平台认证数据库类型;保存前测试写连接和独立读连接,写入必须显式确认,返回只包含 DbKey、类型和回读状态。
64
+ - `microi_query_external_database` 是默认只读入口;`microi_execute_external_database` 是独立超级管理员入口,后端必须从当前 Token 硬校验 `Level >= 9999`。显式确认后不限制 SQL 类型,可执行数据库账号有权执行的 DML、DDL、存储过程、文件能力和多语句;审计仅保留 SQL 哈希、长度、模式和结果。
65
+ - `V8.Dbs.Open` 只能在可信后端代码中使用,连接串来自服务端密钥或管理员配置;禁止把 `V8.Param`、Header 或匿名请求里的连接串直接传入。
66
+ - `microi_import_external_attachment` 仅对后端确认的 `Level >= 9999` 当前用户开放,可访问 HTTP/HTTPS、私网、本机绝对路径和 UNC;不设固定 MCP 大小上限并采用流式迁移。源 URL、鉴权 Header、本机/UNC 路径只以哈希进入审计,能力仍受 API 服务账号和目标基础设施授权约束。
67
+ - 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
68
+
69
+ <!-- /microi-progressive:chunk -->
70
70
  <!-- microi-progressive:chunk id=v8-security-001 sha256=ccec93b880295123923b2375dbc616c5ab02aaf43af9a79f26b7ac953609866d -->
71
- ## 0.5 接口引擎配置安全
72
-
73
- 代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
74
-
75
- | 配置 | 何时开启 |
76
- |------|---------|
77
- | `IsAnonymous = false` | 非公开接口默认关闭,防止匿名调用越权 |
78
- | `StopHttp = true` | 内部接口(核心扣款、内部计算)防止外部直接 HTTP 调用 |
79
- | `LockKey = ...` | 写操作类接口(对账、补单)防止并发执行 |
71
+ ## 0.5 接口引擎配置安全
72
+
73
+ 代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
74
+
75
+ | 配置 | 何时开启 |
76
+ |------|---------|
77
+ | `IsAnonymous = false` | 非公开接口默认关闭,防止匿名调用越权 |
78
+ | `StopHttp = true` | 内部接口(核心扣款、内部计算)防止外部直接 HTTP 调用 |
79
+ | `LockKey = ...` | 写操作类接口(对账、补单)防止并发执行 |
80
80
  | `RateLimit = 60/m` | 公开接口(验证码、登录)防爬虫 |
81
81
  | `LogParam = true` | 支付/审计类接口记录请求 |
82
82
  | `ResponseType = HTTP` | 标准协议需要状态码、重定向、XML/纯文本或特定响应头 |
@@ -92,105 +92,105 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
92
92
  - 没有字段上下文的普通上传默认保持私有安全目录;管理员可在普通 `sys_config.HdfsUploadRules` 按可信角色授予业务目录(含有界 glob)与明确公有权限。必须先拒绝实际路径中的通配符、穿越和平台保留目录,再做模式匹配;通配符不是匿名/跨租户/发布授权。微信待审图片、头像、裁剪/压缩原图等更强规则继续优先。测试同时证明公有字段/目录可用、私有请求/伪造上下文/保留目录不可绕过。
93
93
 
94
94
  <!-- /microi-progressive:chunk -->
95
- <!-- microi-progressive:chunk id=v8-security-002 sha256=7229e5f8d200c0dfbab08752405f5e88d7edc80e9e92b6802880c022b09ca893 -->
96
- ## 1. 防 SQL 注入
97
-
98
- ### 必须:参数化查询
99
-
100
- ```javascript
101
- // ✅ 使用 _Where(自动参数化)
102
- V8.FormEngine.GetTableData('SysUser', {
103
- _Where: [['Account', '=', V8.Param.account]],
104
- _PageSize: 20
105
- });
106
-
107
- // ✅ 必须原生 SQL 时:FromSql 只传 SQL,参数用 AddInParameter
108
- V8.Db.FromSql('SELECT * FROM SysUser WHERE Account = @p0')
109
- .AddInParameter("@p0", V8.Param.account)
110
- .ToArray();
111
- ```
112
-
113
- ### 禁止:字符串拼接
114
-
115
- ```javascript
116
- // ❌ 绝对禁止
117
- V8.Db.FromSql("SELECT * FROM SysUser WHERE Account = '" + V8.Param.account + "'").ToArray();
118
-
119
- // ❌ 禁止动态拼接表名/字段名
120
- V8.Db.FromSql("SELECT * FROM " + V8.Param.table).ToArray();
121
- ```
122
-
123
- <!-- /microi-progressive:chunk -->
124
- <!-- microi-progressive:chunk id=v8-security-003 sha256=8813dffa5c5c4c8816abddf3628579d474fe02137504d6c909f36303d4692560 -->
125
- ## 3. 输入验证
126
-
127
- ### 必填校验
128
-
129
- ```javascript
130
- if (!V8.Param.name || !V8.Param.phone) {
131
- return { Code: 0, Msg: '姓名和手机号不能为空' };
132
- }
133
- ```
134
-
135
- ### 格式校验
136
-
137
- ```javascript
138
- // 手机号
139
- if (V8.Param.phone && !/^1[3-9]\d{9}$/.test(V8.Param.phone)) {
140
- return { Code: 0, Msg: '手机号格式不正确' };
141
- }
142
-
143
- // 邮箱
144
- if (V8.Param.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(V8.Param.email)) {
145
- return { Code: 0, Msg: '邮箱格式不正确' };
146
- }
147
-
148
- // ID 格式(GUID)
149
- if (V8.Param.id && !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(V8.Param.id)) {
150
- return { Code: 0, Msg: 'ID 格式不正确' };
151
- }
152
- ```
153
-
154
- ### 数值范围
155
-
156
- ```javascript
157
- var pageSize = parseInt(V8.Param.pageSize) || 20;
158
- pageSize = Math.max(1, Math.min(pageSize, 100)); // 限制 1~100
159
-
160
- var amount = parseFloat(V8.Param.amount);
161
- if (isNaN(amount) || amount <= 0 || amount > 999999.99) {
162
- return { Code: 0, Msg: '金额不合法' };
163
- }
164
- ```
165
-
166
- <!-- /microi-progressive:chunk -->
167
- <!-- microi-progressive:chunk id=v8-security-004 sha256=1703ea824e4807b24d30225d41e16fb36b0fecc21c63a4ab0296106185460a27 -->
168
- ## 4. 防 XSS
169
-
170
- 四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
171
-
172
- - 纯文本保存原始业务值,渲染时使用 Vue 文本绑定/`textContent`,不要用 `v-html`;
173
- - URL 只允许明确协议和域名,并通过 URL 解析器校验;
174
- - 富文本使用平台统一 allowlist 清洗器,移除 `script`、事件属性、危险协议、`iframe/object` 等;
175
- - V8 模板经 `v-safe-html` / DOMPurify 清洗,内联 `onclick` 等事件会被移除;交互使用平台按钮/V8 事件,不拼接可执行 HTML;
176
- - CSV、Excel、邮件和日志还要分别处理公式注入、HTML 邮件和日志换行注入。
177
-
178
- ```javascript
179
- var content = String(V8.Param.content || '');
180
- if (content.length > 5000) {
181
- return { Code: 0, Msg: '内容过长' };
182
- }
183
- V8.FormEngine.AddFormData('Comment', {
184
- Content: content,
185
- UserId: V8.CurrentUser.Id
186
- });
187
- ```
188
-
189
- <!-- /microi-progressive:chunk -->
190
- ## 详细参考路由(渐进披露)
191
-
192
- 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
193
-
194
- - [references/progressive-01-2-权限校验.md](references/progressive-01-2-权限校验.md):2. 权限校验;5. 防重复提交;6. 敏感数据
195
- - [references/progressive-02-7-日志记录.md](references/progressive-02-7-日志记录.md):7. 日志记录;8. 错误处理;9. Token、终端会话与租户隔离;10. Jint 运行时升级边界;安全检查清单;浏览器访问密钥
196
- <!-- microi-progressive:end -->
95
+ <!-- microi-progressive:chunk id=v8-security-002 sha256=7229e5f8d200c0dfbab08752405f5e88d7edc80e9e92b6802880c022b09ca893 -->
96
+ ## 1. 防 SQL 注入
97
+
98
+ ### 必须:参数化查询
99
+
100
+ ```javascript
101
+ // ✅ 使用 _Where(自动参数化)
102
+ V8.FormEngine.GetTableData('SysUser', {
103
+ _Where: [['Account', '=', V8.Param.account]],
104
+ _PageSize: 20
105
+ });
106
+
107
+ // ✅ 必须原生 SQL 时:FromSql 只传 SQL,参数用 AddInParameter
108
+ V8.Db.FromSql('SELECT * FROM SysUser WHERE Account = @p0')
109
+ .AddInParameter("@p0", V8.Param.account)
110
+ .ToArray();
111
+ ```
112
+
113
+ ### 禁止:字符串拼接
114
+
115
+ ```javascript
116
+ // ❌ 绝对禁止
117
+ V8.Db.FromSql("SELECT * FROM SysUser WHERE Account = '" + V8.Param.account + "'").ToArray();
118
+
119
+ // ❌ 禁止动态拼接表名/字段名
120
+ V8.Db.FromSql("SELECT * FROM " + V8.Param.table).ToArray();
121
+ ```
122
+
123
+ <!-- /microi-progressive:chunk -->
124
+ <!-- microi-progressive:chunk id=v8-security-003 sha256=8813dffa5c5c4c8816abddf3628579d474fe02137504d6c909f36303d4692560 -->
125
+ ## 3. 输入验证
126
+
127
+ ### 必填校验
128
+
129
+ ```javascript
130
+ if (!V8.Param.name || !V8.Param.phone) {
131
+ return { Code: 0, Msg: '姓名和手机号不能为空' };
132
+ }
133
+ ```
134
+
135
+ ### 格式校验
136
+
137
+ ```javascript
138
+ // 手机号
139
+ if (V8.Param.phone && !/^1[3-9]\d{9}$/.test(V8.Param.phone)) {
140
+ return { Code: 0, Msg: '手机号格式不正确' };
141
+ }
142
+
143
+ // 邮箱
144
+ if (V8.Param.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(V8.Param.email)) {
145
+ return { Code: 0, Msg: '邮箱格式不正确' };
146
+ }
147
+
148
+ // ID 格式(GUID)
149
+ if (V8.Param.id && !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(V8.Param.id)) {
150
+ return { Code: 0, Msg: 'ID 格式不正确' };
151
+ }
152
+ ```
153
+
154
+ ### 数值范围
155
+
156
+ ```javascript
157
+ var pageSize = parseInt(V8.Param.pageSize) || 20;
158
+ pageSize = Math.max(1, Math.min(pageSize, 100)); // 限制 1~100
159
+
160
+ var amount = parseFloat(V8.Param.amount);
161
+ if (isNaN(amount) || amount <= 0 || amount > 999999.99) {
162
+ return { Code: 0, Msg: '金额不合法' };
163
+ }
164
+ ```
165
+
166
+ <!-- /microi-progressive:chunk -->
167
+ <!-- microi-progressive:chunk id=v8-security-004 sha256=1703ea824e4807b24d30225d41e16fb36b0fecc21c63a4ab0296106185460a27 -->
168
+ ## 4. 防 XSS
169
+
170
+ 四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
171
+
172
+ - 纯文本保存原始业务值,渲染时使用 Vue 文本绑定/`textContent`,不要用 `v-html`;
173
+ - URL 只允许明确协议和域名,并通过 URL 解析器校验;
174
+ - 富文本使用平台统一 allowlist 清洗器,移除 `script`、事件属性、危险协议、`iframe/object` 等;
175
+ - V8 模板经 `v-safe-html` / DOMPurify 清洗,内联 `onclick` 等事件会被移除;交互使用平台按钮/V8 事件,不拼接可执行 HTML;
176
+ - CSV、Excel、邮件和日志还要分别处理公式注入、HTML 邮件和日志换行注入。
177
+
178
+ ```javascript
179
+ var content = String(V8.Param.content || '');
180
+ if (content.length > 5000) {
181
+ return { Code: 0, Msg: '内容过长' };
182
+ }
183
+ V8.FormEngine.AddFormData('Comment', {
184
+ Content: content,
185
+ UserId: V8.CurrentUser.Id
186
+ });
187
+ ```
188
+
189
+ <!-- /microi-progressive:chunk -->
190
+ ## 详细参考路由(渐进披露)
191
+
192
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
193
+
194
+ - [references/progressive-01-2-权限校验.md](references/progressive-01-2-权限校验.md):2. 权限校验;5. 防重复提交;6. 敏感数据
195
+ - [references/progressive-02-7-日志记录.md](references/progressive-02-7-日志记录.md):7. 日志记录;8. 错误处理;9. Token、终端会话与租户隔离;10. Jint 运行时升级边界;安全检查清单;浏览器访问密钥
196
+ <!-- microi-progressive:end -->