空sandbox属性(sandbox或sandbox="")会彻底禁用iframe所有主动行为,导致白屏、js不执行、表单失效、弹窗拦截、存储不可读写,仅postmessage可用;必须显式添加如allow-scripts等权限才能逐项放行。

空 sandbox 属性会让 iframe 白屏或 JS 完全不执行
不是脚本写错了,是浏览器根本没解析它——sandbox 或 sandbox="" 会直接禁用整个 iframe 的脚本引擎、表单提交、弹窗、存储访问等所有主动行为。Network 面板里可能看到 net::ERR_BLOCKED_BY_RESPONSE,控制台静默无报错,document.querySelector('iframe').sandbox 返回空 DOMTokenList []。
常见误操作:
- React/Vue 中用
v-html或dangerouslySetInnerHTML渲染含 iframe 的 HTML,漏掉sandbox属性 - 动态创建 iframe 后再设置
iframe.sandbox = "allow-scripts"—— 不生效,必须在插入 DOM 前就写死属性值 - 写成
sandbox=" "(带空格)或sandbox="" allow-scripts(非法语法)—— 浏览器按空值处理,全锁死
allow-scripts 是多数第三方组件的最低可行权限
allow-scripts 只解禁外链脚本(<script src="https://cdn.example.com/widget.js"></script>),但不恢复任何内联能力:
- ✅ 可运行:CORS 允许的远程脚本,且该脚本内调用
fetch()、addEventListener()等合法 API - ❌ 不可运行:
<script>alert(1)</script>、onclick="fetch()"、javascript:void(0)、eval()、document.write() - ⚠️ 注意:
allow-scripts不递归授权——脚本里再动态插入<script></script>标签仍被拦截
它也不赋予存储访问权:window.localStorage、document.cookie 仍为空或报 SecurityError,且 window.origin 强制为 "null"。
allow-same-origin 和 allow-scripts 合用极易越权
这两个 token 同时存在,只在 src 真正与父页同协议+域名+端口时才触发效果;否则 allow-same-origin 被浏览器静默忽略,还暴露配置疏漏:
- 若 src 是
https://third-party.com/widget.html,加allow-same-origin毫无作用,但攻击者能据此判断你未校验来源 - 即便同源,
allow-same-origin也只影响存储和 cookie 访问,window.parent、document依然不可读——DOM 隔离是硬边界 - 生产环境嵌第三方内容时,绝对禁止
allow-same-origin;仅当确认 src 是https://yourdomain.com/internal/这类可信路径时才考虑
验证 sandbox 是否生效和最小权限配法
别靠猜,打开控制台直接查:document.querySelector('iframe').sandbox 返回的 DOMTokenList 就是当前实际启用的权限列表。
按真实场景选最小组合,拒绝堆砌:
- 广告/图表(需 JS 渲染 + 新窗口跳转):
sandbox="allow-scripts allow-popups" - 用户反馈表单(需填写 + 提交):
sandbox="allow-scripts allow-forms allow-popups"(提交走 CORS,不依赖同源) - 内部子系统(如
https://app.example.com/admin/):sandbox="allow-scripts allow-same-origin allow-forms"(务必确认 URL 三重一致,且服务端返回正确Access-Control-Allow-Origin)
真正麻烦的不是配什么,而是每次改 src 时都得重新核对是否仍满足 allow-same-origin 的前提——URL 里多一个斜杠、少一个端口,权限就失效。











