空 sandbox 属性(如 sandbox 或 sandbox="")会触发浏览器底层内容拦截,导致 iframe 白屏、HTTP 响应体被丢弃、HTML 解析器不启动,Network 显示 net::ERR_BLOCKED_BY_RESPONSE,控制台无报错;此时 document.querySelector('iframe').sandbox 返回空 DOMTokenList [],等同于完全锁死。

空 sandbox 属性会让 iframe 白屏或 JS 完全不执行
直接写 sandbox 或 sandbox="" 不是“开了沙箱”,而是触发浏览器最底层的内容拦截:HTTP 响应体被丢弃,HTML 解析器根本不启动。现象是 iframe 完全空白,Network 面板显示 net::ERR_BLOCKED_BY_RESPONSE,控制台静默无报错——这不是加载失败,是内容压根没被处理。
验证方式很简单:在控制台执行 document.querySelector('iframe').sandbox,返回空的 DOMTokenList [] 就说明没开任何权限,等同于锁死状态。
-
sandbox=" "(带空格)也等效于空值,同样白屏 - 动态设置
iframe.sandbox = "allow-scripts"无效;属性必须在 DOM 插入前就写死 - React/Vue 中用
v-html或dangerouslySetInnerHTML渲染含 iframe 的 HTML 时,容易漏掉 sandbox 属性值
sandbox="allow-scripts" 是多数第三方组件的最低可行配置
allow-scripts 是绝大多数依赖 JS 执行的第三方组件(如广告 SDK、图表库、统计脚本)的起点。但它只解禁外链脚本(<script src="https://trusted.example/widget.js"></script>),不恢复任何内联能力。
- ✅ 可运行:
<script src="https://cdn.example.com/widget.js"></script>(需服务端返回Access-Control-Allow-Origin) - ❌ 不可运行:
<script>alert(1)</script>(内联 script 被静默忽略) - ❌ 不可运行:
<button onclick="fetch('/api')">click</button>(所有内联事件处理器失效) - ❌ 不可运行:
javascript:void(0)、eval()、document.write()、同步XMLHttpRequest - ⚠️ 注意:
allow-scripts不递归授权——外链脚本里再document.write("<script></script>")仍被禁止
allow-same-origin 不是“让 iframe 和父页变同源”,而是有条件生效
allow-same-origin 只有在 src 真实满足协议 + 域名 + 端口三者完全一致时,才被浏览器识别并启用。否则该 token 被静默忽略,且不报错。
立即学习“前端免费学习笔记(深入)”;
- ❌ 错误示例:
sandbox="allow-scripts allow-same-origin"加载https://third-party.com/widget.html——allow-same-origin实际无效,但暴露配置疏漏 - ✅ 正确场景:仅用于同域可信子系统,如
src="https://yourapp.com/admin.html",且服务端需返回正确 CORS 头 - ⚠️ 即使同源 +
allow-scripts allow-same-origin,iframe 仍无法访问window.parent或父页 DOM —— DOM 隔离是 sandbox 的硬边界,不可绕过 - 生产环境嵌第三方内容时,永远不要加
allow-same-origin
按真实需求配最小权限组合,别堆砌 token
每个加上的 allow- token 都意味着额外攻击面。别抄模板,看真实需求配:
- 需要 JS 交互 + 表单提交?用
sandbox="allow-scripts allow-forms" - 需要弹窗或新窗口跳转?加
allow-popups,建议搭配allow-scripts使用 - 需要用户点击后跳转顶层页面?优先选
allow-top-navigation-by-user-activation,比allow-top-navigation更安全 - 绝对避免
sandbox="allow-scripts allow-same-origin allow-top-navigation"这类组合——它几乎等同于撤掉沙箱
真正容易被忽略的是:allow-same-origin 不是锦上添花,而是高危开关;而 postMessage 才是跨 frame 通信的唯一合规方式,且接收方必须校验 event.origin,不能依赖 token 绕过验证。



















