只写 sandbox 就白屏,不是隔离而是锁死;它强制 iframe origin 为 null,脚本不执行、表单无反应、localstorage 报错且控制台静默,必须显式添加 allow-scripts 等权限 token 才能恢复对应能力。

只写 sandbox 就白屏,不是隔离而是锁死
直接写 <iframe src="widget.html" sandbox></iframe> 或 <iframe sandbox=""></iframe>,浏览器会拒绝解析整个响应体,Network 面板显示 net::ERR_BLOCKED_BY_RESPONSE,页面白屏、JS 不执行、表单无反应、localStorage 访问报错——控制台静默,不报任何错误。这不是加载失败,是内容被底层拦截。你嵌的第三方组件连 alert(1) 都不会弹。
allow-scripts 是绝大多数场景的起点,但不是万能钥匙
要让 JS 运行起来,至少得加 allow-scripts。但它只解禁外链脚本(<script src="..."></script>),以下行为依然被禁止:
-
onclick、onload等内联事件处理器全部失效,必须改用addEventListener -
document.write()、同步XMLHttpRequest、eval()仍被拦截 - iframe 的
window.origin强制为"null",无法访问window.parent或父页 DOM -
localStorage绑定到临时匿名上下文,刷新即丢,DevTools 的 Application 标签页可能为空或显示(inactive)
哪些 allow-* 组合实际可用,哪些必须避开
按最小权限原则配,每个 token 都有明确作用和风险:
-
allow-scripts allow-popups:适合广告、图表等需 JS + 新窗口的第三方组件 -
allow-scripts allow-forms:适合嵌入问卷、表单提交类内容;提交目标仍受 CORS 控制 -
allow-scripts allow-same-origin:仅当src真正与父页协议+域名+端口完全一致(如都是https://yourapp.com/widget.html)时才生效;不同源时该 token 被浏览器静默忽略,加了也无效 -
allow-top-navigation和allow-same-origin组合基本等于关掉沙箱,生产环境应绝对避免
验证是否生效,别靠猜
打开浏览器控制台,执行:
document.querySelector('iframe').sandbox
返回空 DOMTokenList [] 表示权限全锁死;返回字符串如 "allow-scripts allow-popups" 才说明配置已生效。动态设置 iframe.sandbox = "allow-scripts" 无效——属性必须在插入 DOM 前就存在。
真正容易被忽略的点是:sandbox 单独使用远远不够,必须配合 referrerpolicy="no-referrer"、loading="lazy"、srcdoc 或服务端 X-Frame-Options 才构成纵深防护。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











