WU / 文档通用微前端
中文

HTTP 策略与宿主边界

配置响应头、CSP、origin 和发布策略,并区分它们与运行时权限。

版本、变更与要求见 Framework 3.2 与 CLI 1.0。

职责不同的两种控制

wu.config.json 中的 security 定义 WU 提供并在构建时导出给其他宿主的 HTTP 策略。每个应用的 grants 属于宿主授予运行时的权限。CSP 响应头不能替代能力契约,grant 本身也不能让浏览器加载被 CSP 阻止的 origin。

配置

{
  "security": {
    "enabled": true,
    "csp": "",
    "frame_options": "DENY",
    "referrer_policy": "strict-origin-when-cross-origin",
    "nosniff": true,
    "app_origins": ["https://apps.example.com"],
    "connect_origins": ["https://api.example.com"],
    "wasm": false
  }
}

示例中的域名是占位符。策略应描述应用实际使用的 origin。

字段 作用
enabled 启用或禁用整组响应头
csp 自动生成、字面量策略、report-only 或 off
frame_options X-Frame-Options;默认 DENY
referrer_policy 引用来源策略
permissions_policy 通过 Permissions-Policy 管理浏览器能力
hsts Strict-Transport-Security;通过 TLS 提供内容时适用
nosniff X-Content-Type-Options: nosniff
corsOrigin 或 cors CORS origin;cors 也支持包含 origin 的对象
app_origins bundle 的 origin:脚本和连接
connect_origins API 的 origin:连接
wasm 在生成的 CSP 中允许 WASM 编译

解析器还支持多个字段的 camelCase 写法,例如 appOrigins、connectOrigins、frameOptions 和 wasmUnsafeEval。CORS 有一个重要例外:cors_origin 是结构内部名称,但 JSON 只接受 corsOrigin 或 cors,不接受该 snake_case 写法。

值的约定

文本响应头字段中,空字符串交由 WU 决定,off 则不输出该响应头。csp: "report-only" 在报告响应头中生成等效策略,浏览器仅报告违规,不据此阻止。字面量 CSP 字符串会原样使用。

生成过程分析最终文档的内联脚本并计算哈希,因此必须在插入目录或 import map 之后执行。onclick 之类的 HTML 处理属性与具有哈希的脚本处理方式不同,诊断会指出不兼容项。把事件放在模块、样式放在样式表中,可以避免依赖 HTML 例外。

在 1.2.0 中,CSP 哈希按页面计算并规范化 CRLF 换行。security.upgradeInsecureRequests 控制是否升级到 HTTPS。构建保留 shell 的 _headers,对哈希文件应用不可变缓存,并验证字段以防止响应头注入。使用 wu doctor --url 检查托管服务实际发送的策略。

CORS

默认不输出 Access-Control-Allow-Origin。同源提供微应用无需启用 *。拓扑要求不同 origin 时,请配置具体值,并同时检查 CSP、凭据和目标策略。

代理规则的 cors 选项只属于该规则,不等同于控制生产服务器响应的 security.corsOrigin。

可发布文件

路径安全检查先解码转义,再检查各路径段,并拒绝目录穿越、控制字符、反斜杠和绝对路径。文件过滤器阻止点文件和被视为敏感的扩展名或名称。.well-known 是有意保留的例外,因为它包含公开协议文档。

构建和 doctor 会检查可发布区域,但凭据仍应存放在后端或其环境中。应用需要私有 token 时,不应将其加入源码或 public/,即使具体文件名没有出现在阻止列表中。

开发服务器对 Host、CORS、HMR 和文件访问应用独立策略,涵盖 sourcemap、模块和带查询参数的导入。使用 dev.allowedHosts 配置隧道;只有 .env 中的 VITE_* 和 WU_* 会进入浏览器。迁移这些行为请参阅开发。

Sentinel

sentinel 实例在 wu dev 中禁用,在 wu serve 中按默认值创建。源码包含请求分类和 ACP 协议路由发布功能。这些模块的存在不证明具备全面的自动化防护,也不能替代产品访问控制。

CLI 1.2.0 允许每个应用使用 manifest: "define",并通过 security.frameOrigins 配置远程 iframe。frame 源只进入 frame-src,不会允许宿主脚本或连接。目录导航过滤不会阻止 fetch 读取。见 远程应用 与 构建。

实现参考

  • wu-cli/src/config/config.zig
  • wu-cli/src/runtime/security.zig
  • wu-cli/src/runtime/project_fs.zig
  • wu-cli/src/runtime/allowed_hosts.zig
  • wu-cli/src/runtime/dev/env.zig
  • wu-cli/tests/dev-security.test.cjs
  • wu-cli/tests/doctor-policy.test.cjs
一起完善 WU

发现了问题?有新的想法?

你的使用体验能让 WU 变得更好。告诉我们遇到的问题,或支持项目的持续开发。