Appearance
安全基线(Web / 小程序 / 网关)
与 permission-staging-checklist.md 配套。改认证、上传、通知、日志时对照本页。
XSS(跨站脚本)
| 层 | 现状 / 约定 |
|---|---|
| Vue 模板 | 禁止 v-html;用户输入用 mustache 插值或 <pre> 文本展示(已审计,当前无 v-html) |
| 通知/备注 | 管理端通知详情用 <pre> 纯文本,不做 HTML 渲染 |
| 静态文件链接 | 使用 buildSafeStaticUploadUrl(@taskflow/shared/security/safe-static-upload-key),拒绝 ..、\0、带协议的 key |
| 小程序跳转 | isSafeMiniappPageUrl 限制仅 /pages/...,拒绝 ..、//、javascript: |
网关与 HTTP 头
- Helmet(
backend/src/apps/gateway/main.ts):X-Content-Type-Options、X-Frame-Options等;API 不启 CSP(避免误伤 JSON/跨域)。 - 生产 Nginx(
deploy/docker/nginx-frontend.conf):nosniff、SAMEORIGIN、Referrer-Policy。 - CORS:网关
CORS_ORIGIN仅允许实际 Web 管理端域名(可逗号分隔多源);开发可用http://localhost:5173,生产勿用*,否则任意站点可带 Cookie/凭证跨域调用 API(见backend/.env.example)。
认证与日志
- JWT 仅存客户端(Web
localStorage/ 小程序 Storage);勿把 token 打进前端日志或 URL query。 - HTTP 日志 body 脱敏:
sanitizeLogBody(密码、access_token、openid、code等 →***)。 - 微信 openid 登录路由须为 Sys
skip(见sys-route-permission-registry+canonicalSysRoutePath)。
上传
- 凭证/附件 key 由服务端签发;展示链接走
buildSafeStaticUploadUrl,不拼接用户原始字符串为href。 - 上传接口仍须在服务端校验 MIME、大小与站点权限(业务层
assertSiteScope等)。
权限(业务安全)
- Acc 写操作:
btn_acc_*_write与路由 registry 一致;预发可开ACC_ROUTE_GUARD_STRICT。 - 记账:openid/JWT 即可,不附
X-Site-Id(见miniapp-bookkeeping-user-scope.mdc)。
建议后续(未默认实施)
- 生产 HSTS:HTTPS 终止在 Nginx 时配置
Strict-Transport-Security(见deploy/docker/snippets/nginx-hsts.conf.snippet)。 - Web 管理端 CSP(需评估 Vite 内联脚本与 Naive UI)。
- 依赖漏洞扫描:发版前
pnpm run check:audit(仅 backend + frontend prod、high+;miniapp 用pnpm run check:audit:miniapp单独看)。经scripts/check-audit.mjs走 registry.npmjs.org。 - 本地可读报告:
pnpm run audit:report(按 scope 列出 advisory 与 npm 建议修复版)。 - 已登记例外(
scripts/check-audit.mjs→KNOWN_EXCEPTIONS,仍打印但不 fail):- miniapp
vite@5.x· GHSA-fx2h-pf6j-xcff(Windows dev serverfs.deny)— uni-app 构建链锁定 Vite 5,修复版 ≥6.4.3 与@dcloudio/vite-plugin-uni不兼容;不进微信小程序运行时。待 DCloud 支持 Vite 6+ 后移除。
- miniapp