@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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/LICENSE +21 -21
- package/README.md +71 -71
- package/assets/build-meta.json +6 -6
- package/assets/feature-matrix.json +138 -138
- package/assets/logo.svg +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-codex-stdio-adapter.js +0 -0
- package/scripts/mcp-server.js +102 -101
- package/scripts/microi-cli.js +57 -57
- package/scripts/microi-codex-broker.js +450 -450
- package/scripts/microi-codex-router.js +0 -0
- package/scripts/microi-skills.meta.json +366 -366
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +27 -27
- package/skills/README.md +286 -286
- package/skills/ai-engine/SKILL.md +265 -265
- package/skills/ai-engine/agents/openai.yaml +4 -4
- package/skills/ai-platform-governance/SKILL.md +177 -177
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
- package/skills/app-store/SKILL.md +392 -396
- package/skills/app-store/agents/openai.yaml +4 -4
- package/skills/business-blueprint/SKILL.md +193 -193
- package/skills/datasource-engine/SKILL.md +90 -90
- package/skills/datasource-engine/agents/openai.yaml +4 -4
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +78 -78
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +171 -172
- package/skills/job-engine/agents/openai.yaml +4 -4
- package/skills/message-notification/SKILL.md +155 -156
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +102 -106
- package/skills/microi-ai-application/agents/openai.yaml +4 -4
- package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
- package/skills/microi-client-frontend/SKILL.md +235 -240
- 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
- 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
- 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
- package/skills/microi-codex/SKILL.md +72 -76
- package/skills/microi-codex-installer/SKILL.md +225 -223
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +107 -111
- package/skills/microi-db-schema/SKILL.md +175 -175
- package/skills/microi-db-schema/agents/openai.yaml +4 -4
- package/skills/microi-db-schema/references/core-tables.md +695 -695
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +202 -202
- package/skills/microi-db-schema/references/schema.md +646 -646
- package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
- package/skills/microi-deployment/references/deployment-matrix.md +101 -101
- package/skills/microi-docs-coverage/references/capability-map.md +0 -1
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +226 -226
- package/skills/microi-form-engine/references/component-catalog.md +216 -216
- package/skills/microi-form-engine/references/data-source-events.md +124 -124
- package/skills/microi-form-layout/SKILL.md +205 -205
- 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
- package/skills/microi-frontend-sdk/SKILL.md +188 -188
- 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
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +322 -323
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- package/skills/microi-mobile-app-quality/SKILL.md +181 -181
- 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
- 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
- package/skills/microi-solution-quotation/SKILL.md +78 -78
- package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
- package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
- package/skills/microi-sso/references/acceptance.md +49 -49
- package/skills/microi-sso/references/configuration-and-security.md +53 -53
- package/skills/microi-sso/references/inbound.md +53 -53
- package/skills/microi-sso/references/outbound.md +39 -39
- package/skills/microi-system-delivery/SKILL.md +134 -134
- 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
- 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
- package/skills/microi-ui/SKILL.md +174 -174
- 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
- package/skills/microi-uniapp-frontend/SKILL.md +193 -193
- 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
- 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
- package/skills/microi.v8.js +1921 -1921
- package/skills/module-engine/SKILL.md +237 -250
- package/skills/module-engine/references/module-config.md +204 -204
- package/skills/ocr-engine/SKILL.md +113 -113
- package/skills/ocr-engine/agents/openai.yaml +4 -4
- package/skills/page-engine/SKILL.md +180 -191
- 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
- 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
- package/skills/performance-testing/SKILL.md +221 -221
- package/skills/playwright-e2e/SKILL.md +197 -197
- 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
- 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
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
- package/skills/print-engine/SKILL.md +259 -259
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/report-engine/agents/openai.yaml +4 -4
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/search-engine/agents/openai.yaml +4 -4
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +238 -238
- package/skills/system-observability/references/memory-incident-triage.md +70 -70
- package/skills/translate-engine/SKILL.md +140 -140
- package/skills/translate-engine/agents/openai.yaml +4 -4
- package/skills/ui-design/SKILL.md +191 -191
- package/skills/ui-design/assets/templates/MCI-DESIGN.md +198 -198
- package/skills/ui-design/references/design-pattern-library.md +184 -184
- package/skills/ui-design/references/mci-design-contract.md +163 -163
- 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
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +137 -137
- 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
- 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
- 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
- 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
- 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
- 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
- package/skills/uniapp-mall-assets/SKILL.md +176 -176
- package/skills/unity-integration/SKILL.md +155 -155
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +103 -103
- package/skills/unity-integration/references/sdk-api.md +82 -82
- package/skills/unity-integration/references/toolbox-migration.md +66 -66
- package/skills/unity-integration/references/webgl-hosting.md +57 -57
- package/skills/v8-cache-pattern/SKILL.md +306 -306
- package/skills/v8-crud-api/SKILL.md +175 -175
- 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
- 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
- package/skills/v8-debugging/SKILL.md +284 -284
- package/skills/v8-explorer-tree/SKILL.md +228 -228
- package/skills/v8-export-import/SKILL.md +209 -209
- 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
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
- 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
- package/skills/v8-file-upload/SKILL.md +256 -263
- 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
- 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
- package/skills/v8-formengine-http/SKILL.md +219 -219
- package/skills/v8-frontend-events/SKILL.md +178 -178
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +246 -246
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
- package/skills/v8-http-integration/SKILL.md +182 -182
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
- 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
- package/skills/v8-image-processing/SKILL.md +190 -190
- package/skills/v8-image-processing/agents/openai.yaml +4 -4
- package/skills/v8-image-processing/references/api-reference.md +623 -623
- package/skills/v8-menu-buttons/SKILL.md +180 -180
- 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
- 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
- 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
- package/skills/v8-mongodb/SKILL.md +192 -192
- package/skills/v8-mq-mqtt/SKILL.md +175 -176
- package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +219 -219
- package/skills/v8-security/SKILL.md +168 -168
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +198 -198
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -158
- package/skills/v8-sql-query/SKILL.md +302 -302
- package/skills/v8-table-event/SKILL.md +144 -144
- 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
- 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
- package/skills/v8-tcp-integration/SKILL.md +147 -147
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +167 -167
- package/skills/v8-utilities/SKILL.md +90 -90
- package/skills/v8-utilities/references/client-api-index.md +143 -143
- package/skills/v8-utilities/references/platform-http-routes.md +83 -83
- package/skills/v8-utilities/references/server-api-index.md +188 -188
- package/skills/v8-workflow/SKILL.md +216 -243
- 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
- package/skills/vision-engine/SKILL.md +159 -159
- package/skills/vision-engine/agents/openai.yaml +4 -4
- package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
- package/skills/workspace-conventions/SKILL.md +261 -261
- 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
- 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
- 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 -->
|