安全须知¶
HTML 渲染会连接网络、读取资源、执行模板或运行浏览器。Provider 不替调用方建立业务级信任边界。
本地文件¶
- 保持
render.resources.local_access.allow_any_path: false。 render.resources.local_access.allowed_paths只加入最小只读目录。- 路径授权必须在读取前完成,并防止
..与 symlink 越界。 - 不要把用户提供的任意路径传给模板、Markdown 或资源辅助函数。
- cache 命中不能绕过授权;策略变更后应创建新的 composition。
不可信 HTML 与模板¶
Jinja autoescape 不能替代模板源码信任。模板源码、filters 与 extensions 只能来自受控代码;用户输入只能作为 variables 值。
render_markdown 会保留 Markdown 中的原始 HTML,并把转换结果作为 HTML 片段交给 Provider;它不提供 HTML 消毒边界。来自用户或模型的 Markdown 可能携带 <script>、事件处理属性和外链资源,其脚本执行与网络访问风险和 render_html 相同。若不需要富文本,使用会转义文本内容的 render_text;若需要 Markdown,应在渲染前按业务策略对白名单标签、属性和 URL 做清洗。
artifact = await render_template(
TRUSTED_TEMPLATE_DIR,
"card.html",
variables={"display_name": untrusted_text},
)
不要把用户输入拼成 <script>、event handler、CSS URL 或 Jinja 表达式。不要把“内容由模型生成”当作可信来源。
远程导航与 SSRF¶
Playwright Page 可访问 Bot 网络可达的任意目标。对用户提供的 URL:
- 建立 scheme/host/port allowlist;
- 解析 DNS 并阻止 loopback、link-local、metadata 与私网地址;
- 谨慎处理重定向和 DNS rebinding;
- 在容器/网络层限制 egress;
- 设置连接和完整操作超时。
resource_policy 只控制文档资源处理,不是 SSRF 防护。
filehost¶
filehost 只应作为受控 asset publisher:
- 保持路径白名单最小;
- 保持请求头守卫并在代理中透传;
- 认证成功的响应会携带
Access-Control-Allow-Origin: *,以允许远程页面加载字体; - 不向公网暴露通用文件读取路由;
- 不把 URL 视为永久地址;
- 了解 TTL 只释放映射,不承诺逐文件物理擦除。
对机密内容,优先使用 render-scoped memory transport。
通配 CORS 不是授权边界
未携带正确守卫请求头的 filehost 请求仍会返回 403,且不会获得通配 CORS响应头。反向代理必须分别保留入站守卫请求头和出站 CORS 响应头。
Provider 配置与 Capability¶
endpoint、代理凭据、headers 和 storage state 都是敏感信息:
- 使用部署平台 secret,不写入仓库;
- 日志中不输出完整
render.provider_config; - 不向不可信调用方暴露 raw Playwright Page 或 Browser;
- 不跨请求复用含认证状态的 Page/context;
- 只加载可信第三方 Provider distribution。
插件数据目录可能包含 Playwright 浏览器文件与运行时快照。部署时限制目录权限、备份范围和容器挂载;不要把它当作公开静态目录。其他 Provider 若在此保存状态,也必须遵循同一敏感数据生命周期。
Provider entry point 会在进程内执行代码,其权限与 Bot 相同。
资源与拒绝服务¶
- 保持 cache entry/byte 上限;
- 限制 HTML、Markdown、模板变量与 asset 大小;
- 设置
timeout_seconds; - 限制 Playwright 页面、HTMLKit native thread、Takumi worker 和并发请求数;
- 对用户可控 URL 限制下载大小与重定向次数。
单个巨大资源不应挤占整个缓存预算;超限应作为资源错误报告。
遥测¶
不要记录 HTML、URL、路径、模板变量、header、字体名、digest 或 bytes。只使用低基数 operation、Provider identity、status 和聚合 cache 统计。observer异常必须与业务结果隔离。
发布前检查¶
- 本地路径和 symlink 越界测试;
- SSRF 与重定向策略测试;
- filehost 路由认证、CORS 和双向代理透传测试;
- cache/并发/取消上限测试;
- Provider extras 与第三方许可审查;
- secret 扫描和最小权限容器配置。