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

为什么加了sandbox却白屏或JS不执行
因为sandbox或sandbox=""不是“开启沙箱”,而是直接锁死所有主动行为:脚本不解析、onclick失效、fetch()静默失败、localStorage报SecurityError,连console.log()都不输出。浏览器不报错,只是归零处理。
验证方式很简单:打开控制台执行document.querySelector('iframe').sandbox,返回空DOMTokenList []就说明没开任何权限。
- 动态设置
iframe.sandbox = "allow-scripts"无效——必须在插入 DOM 前写死属性值 -
sandbox=" "(带空格)或sandbox="" allow-scripts(语法错误)都会被当作空值处理,全锁死 - Network 面板看到
net::ERR_BLOCKED_BY_RESPONSE,就是内容被底层拦截,不是加载失败
sandbox="allow-scripts"能跑什么、不能跑什么
这是第三方组件最常需要的最低权限,但它只解禁外链脚本加载与执行,不恢复任何内联能力。
- ✅ 可运行:
<script src="https://cdn.example.com/widget.js"></script>(需服务端返回Access-Control-Allow-Origin) - ❌ 不可运行:
<script>alert(1)</script>、<button onclick="fetch()"></button>、javascript:void(0)、eval()、document.write() - ⚠️ 注意:
allow-scripts不递归授权——脚本里再document.createElement('script')仍被拦截 - ⚠️
window.origin强制为"null",window.parent和document.cookie依然不可访问
哪些allow-*组合实际可用,哪些绝对要避开
每个 token 都对应明确攻击面,堆砌等于撤掉沙箱。按真实需求配,拒绝模板化复制。
- 只展示广告/图表:
sandbox="allow-scripts allow-popups"(禁表单、禁存储、禁跳转父页) - 嵌入用户问卷(需提交):
sandbox="allow-scripts allow-forms allow-popups"(表单走 CORS 提交) - 加载同源可信子系统(如
https://yourapp.com/admin.html):sandbox="allow-scripts allow-same-origin allow-forms"(必须确认协议+域名+端口全一致) - 绝对不要写:
sandbox="allow-scripts allow-same-origin allow-top-navigation"——allow-top-navigation能让子页跳转整个 tab,是钓鱼常用手法
allow-same-origin的真实效果与高危误用
它不是“信任开关”,而是同源校验通过后的“解锁钥匙”。不同源时浏览器会静默忽略该 token,不报错也不生效。
- 如果父页是
https://a.com,iframesrc是https://third-party.com/widget.html,硬加allow-same-origin毫无作用,反而暴露配置疏漏 - 即使同源,
allow-same-origin也只影响localStorage、cookie和同源fetch(),window.parent和document依然不可读——DOM 隔离是硬边界 - 生产环境嵌第三方内容时,永远不要加
allow-same-origin;通信必须走postMessage,且父页必须校验event.origin,不能写'*'
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











