Files
HomeDash/admin-server
HomeDash Bot 22c405d2a0 feat(admin): 新增可内嵌性三态探测 /admin/api/frameable
Dashy 的「工作空间」用 iframe 打开应用,被 X-Frame-Options /
CSP frame-ancestors 拒绝时浏览器只给一片空白,而且 JS 无法区分
「被拒绝」与「加载中」(onload 一样触发)。所以由服务端读响应头。

实测 24 个应用:19 个可内嵌;Gitea(含内网 IP) 与 docker.com 是
SAMEORIGIN,Dify 是 DENY。

三态而非布尔,因为探测本身会失真:
- conclusive=true  frameable=false → 有明确拒绝证据(XFO / frame-ancestors)
- conclusive=true  frameable=true  → 2xx 且无拒绝头
- conclusive=false                  → 探测被 WAF 拦成 403、或跳到了别的主机
  这类不给结论,前端照常尝试内嵌,但在工具条里说明原因并留出新标签页退路。

两个关键细节:
1) 转发浏览器自己的 Cookie。门户后面的应用对未登录请求会 302 到登录页
   (登录页没有 X-Frame-Options),不转发会话就会把「重定向到登录页」
   误判成「可内嵌」——这是线上真实发生过的误判。
2) 用普通浏览器 UA。自造的 "HomeDash embed check" UA 会被 WAF 当机器人拦成 403。

测试覆盖:无头/有 XFO/有 CSP frame-ancestors/WAF 403/带与不带 Cookie。
2026-09-11 19:04:38 +08:00
..