直接写 sandbox 或 sandbox="" 会触发浏览器最底层拦截,HTTP响应体被拒收、HTML解析跳过、DOM构建不启动,导致白屏和net::ERR_BLOCKED_BY_RESPONSE;必须显式配置如sandbox="allow-scripts"等白名单token才能逐项放行权限。

直接写 sandbox 就等于锁死全部权限——脚本不执行、表单点不动、window.open() 静默失败、localStorage 访问抛错,连 HTML 都不会进 DOM 构建流程。必须显式加白名单 token 才能恢复对应能力。
为什么只写 sandbox 或 sandbox="" 会导致白屏/无响应
这不是加载慢或报错,是浏览器在解析阶段就拒绝整个 iframe 内容。Network 面板显示 net::ERR_BLOCKED_BY_RESPONSE,而不是 404 或 CORS 错误。验证方式很简单:控制台执行 document.querySelector('iframe').sandbox,返回空 DOMTokenList [] 就说明没开任何权限。
-
onclick="alert(1)"、onload、javascript:void(0)全部静默失效 -
<script>console.log('inline')</script>根本不执行 - 哪怕
src指向同域页面,origin 也会被强制设为"null",彻底失去同源身份
sandbox="allow-scripts" 是第三方嵌入的最低可行配置
广告、统计 SDK、图表组件等依赖 JS 的内容,至少要这个 token 才能跑起来。但它只解禁外链脚本(<script src="xxx"></script>),不恢复以下行为:
- 内联事件处理器(
onclick、onload)仍被拦截 -
eval()、setTimeout("...")、Function构造器被禁 - 子页无法访问
parent.document,即使同源 -
postMessage仍可用,但目标 origin 必须显式校验,不能用'*'
哪些 token 绝对不该加(尤其对第三方)
生产环境嵌广告、Widget、统计脚本时,这两个 token 属于高危配置,加了等于放弃沙箱价值:
立即学习“前端免费学习笔记(深入)”;
-
allow-same-origin:仅当src真是同源(协议+域名+端口全一致)才可能生效;对第三方域名硬加,token 被静默忽略,还暴露你配置疏忽;一旦真同源且启用,localStorage、同源fetch()、甚至document.write()都恢复——等价于没沙箱 -
allow-top-navigation:允许子页执行top.location.href = 'https://phishing.site',是钓鱼常用手法,严禁启用
常见安全组合应按需最小化:广告用 sandbox="allow-scripts allow-popups",反馈表单用 sandbox="allow-scripts allow-forms allow-popups"。每个加上的 token 都意味着额外攻击面,别抄模板。
动态设置 iframe.sandbox 属性无效
在 Chrome/Firefox 中,JS 执行 el.sandbox = "allow-scripts" 会被忽略,控制台可能报 Failed to set the 'sandbox' property...。沙箱策略只在 iframe 创建并开始加载前生效。
- 服务端渲染:直接写死属性,如
<iframe sandbox="allow-scripts"></iframe> - 前端动态插入:用字符串拼接或
innerHTML设置(注意 XSS),不能先创建空 iframe 再补sandbox - 需要不同权限?提前生成多个模板,按需挂载
真正起作用的权限,得进 DevTools → Elements → 右键 iframe → “Inspect iframe” → Permissions 标签页里确认是否显示为 Allowed,光看 HTML 属性没用。



















