fix(mindspace): guard published pages against blocked CDN scripts
Pre-bundle Chart.js, auto-rewrite common CDN references at publish and serve time, and block unknown external script src during publication scans so interactive dashboards keep working under CSP. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -164,6 +164,17 @@ CREATE TABLE IF NOT EXISTS survey_responses (
|
||||
<script src="/assets/page-data-client.js"></script>
|
||||
```
|
||||
|
||||
- **第三方 JS 库**(Chart.js、ECharts 等)禁止写 CDN `https://...`;发布页 CSP 只允许同源脚本。优先用平台预置路径,或下载到 `public/assets/` 后用相对路径引用:
|
||||
|
||||
```html
|
||||
<!-- 推荐:平台已预置 Chart.js -->
|
||||
<script src="/assets/chart.umd.min.js"></script>
|
||||
<!-- 或页面自有副本 -->
|
||||
<script src="assets/chart.umd.min.js"></script>
|
||||
```
|
||||
|
||||
平台会在发布/访问时自动把常见 Chart.js CDN 改写为 `/assets/chart.umd.min.js`;其它未知 CDN 会在发布检查中被拦截。
|
||||
|
||||
### 4. 发布并绑定页面(推荐)
|
||||
|
||||
用 `private_data_bind_workspace_page` 一步完成:**创建/更新页面记录 → 发布 → 写入 Page Data 策略**。
|
||||
@@ -258,10 +269,11 @@ CREATE TABLE IF NOT EXISTS survey_responses (
|
||||
5. **禁止**创建 `scripts/*-api.mjs`、Express 服务、或监听独立端口(如 `8899`)
|
||||
6. **禁止** HTML 中硬编码 `http://127.0.0.1:端口` 或自定义 `/api/survey/*`
|
||||
7. **禁止**在 HTML 中使用 `onclick` / `oninput` 等内联事件属性(MindSpace 发布页 CSP 不允许);改用 `addEventListener`
|
||||
8. **禁止**在页面 JS 中直接使用 `better-sqlite3` 或读取 `.sqlite` 文件路径
|
||||
9. **禁止**只 `CREATE TABLE` 而不 `private_data_register_dataset`
|
||||
10. **禁止**未配置 `private_data_set_page_policy` 就让页面调用公开 API
|
||||
11. **禁止**先发布占位页(如 `<p>问卷页面</p>`)再让用户访问 `/u/.../pages/...`
|
||||
8. **禁止**用 CDN `https://...` 引用 `<script src>`(发布页 CSP 仅允许同源;Chart.js 用 `/assets/chart.umd.min.js` 或 `public/assets/` 本地文件)
|
||||
9. **禁止**在页面 JS 中直接使用 `better-sqlite3` 或读取 `.sqlite` 文件路径
|
||||
10. **禁止**只 `CREATE TABLE` 而不 `private_data_register_dataset`
|
||||
11. **禁止**未配置 `private_data_set_page_policy` 就让页面调用公开 API
|
||||
12. **禁止**先发布占位页(如 `<p>问卷页面</p>`)再让用户访问 `/u/.../pages/...`
|
||||
|
||||
## 交付前自检
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ description: 在专属 MindSpace 目录生成可公开访问的静态 HTML 报
|
||||
7. 默认只生成 HTML;不要在没有明确需求时强制生成 Word、PDF、长图等伴生文件
|
||||
8. 只有用户明确要求 **Word/PDF 等二进制下载** 时:文件单独落盘(如 `public/方案.docx`),链接用相对路径;**禁止**在 HTML 内用 `data:...;base64,...` 嵌入 docx(易截断损坏)
|
||||
9. 只有用户明确要求**长图下载**时:必须先 `load_skill` → `long-image-download`,调用 `generate_long_image` 生成同目录 `public/<页面名>.long.png`,再返回长图预览与下载链接;禁止把 `.thumbnail.svg` 当成长图
|
||||
10. **禁止**在 HTML 中用 CDN `https://...` 引用 `<script src>`;MindSpace 发布页 CSP 仅允许同源脚本。常用库优先用平台路径(如 Chart.js → `/assets/chart.umd.min.js`),或下载到 `public/assets/` 后相对引用
|
||||
|
||||
详细约束以工作区内的 `.goosehints` 与 `.agents/skills/static-page-publish/SKILL.md` 为准。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user