加了sandbox即全锁死:脚本不执行、表单不提交、弹窗拦截、localstorage不可读写,仅postmessage可用;须显式添加allow-scripts等白名单权限才能逐项放行。

加了 sandbox 属性却脚本不执行、表单点不动、控制台没报错?不是浏览器坏了,是它真被“锁死了”——sandbox 默认禁用一切主动行为,不显式放行,就什么也干不了。
为什么加了 sandbox 就白屏或 JS 完全不运行
写成 <iframe sandbox></iframe> 或 <iframe sandbox=""></iframe>,等价于启用全部限制:JS 不解析、onclick 失效、fetch() 报错、localStorage 访问被拒、表单点击无反应、window.open() 静默拦截。浏览器不会报错,而是直接丢弃这些行为。
- 控制台执行
document.querySelector('iframe').sandbox,返回空DOMTokenList []就说明权限全关,没开任何白名单 -
allow-scripts是最常加也最容易误判的权限:它只解禁外链脚本(<script src="xxx.js"></script>)和eval()类执行,但内联事件(如onclick="alert(1)")、javascript:void(0)、document.write()仍被屏蔽 - 动态设置
iframe.sandbox = "allow-scripts"无效;必须在 DOM 插入前就写死属性值
allow-scripts 和 allow-same-origin 合用的真实效果与风险
这两个 token 经常一起出现,但它们不是简单叠加,而是存在强依赖和高风险:
-
allow-same-origin单独写毫无意义:浏览器会先校验 iframe 的src是否与父页严格同源(协议+域名+端口全一致),不同源时该 token 直接被忽略,且不报错 - 只有
allow-scripts allow-same-origin同时存在,且src确实同源时,localStorage、fetch()同源请求、cookie读写才可能恢复;但window.parent和document依然不可访问——DOM 隔离是 sandbox 的硬边界 - 若
src="https://third-party.com/widget.html"却硬加allow-same-origin,既得不到权限,又暴露配置疏忽,还可能被用于试探信任边界 - 生产环境嵌第三方内容时,永远不要加
allow-same-origin
按场景选最小权限组合,避免堆砌
每个加上的 token 都意味着额外攻击面。别抄模板,看真实需求配:
- 只展示带 JS 的广告/图表:
sandbox="allow-scripts allow-popups"(禁表单、禁存储、禁跳转父页) - 嵌入用户填写的问卷(需提交):
sandbox="allow-scripts allow-forms allow-popups"(表单走 CORS 提交,不碰allow-same-origin) - 加载同源可信子系统(如
https://yourapp.com/admin.html):sandbox="allow-scripts allow-same-origin allow-forms"(必须确认 URL 真同源,且服务端返回正确 CORS 头) - 绝对不要写:
sandbox="allow-scripts allow-same-origin allow-popups allow-forms allow-top-navigation"——这几乎等于没沙箱
验证 sandbox 是否真正生效的实操方法
别靠文档猜,打开开发者工具直接查:
- 选中 iframe 元素 → 控制台输入
document.querySelector('iframe').sandbox,返回的是DOMTokenList对象,比如DOMTokenList ["allow-scripts", "allow-forms"]才表示实际生效 - 如果返回空列表或只含
"",说明权限没开,所有功能都会静默失败 - 注意旧版 Safari(15.4 之前)和部分 Android WebView 可能忽略未声明的权限项,表现为“本该禁的却能跑”,这不是功能正常,是沙箱根本没生效
- Chrome 117+ 会对缺失
allow-scripts但含内联onload的 iframe 自动补上该权限,你以为关了 JS,其实开了
真正容易被忽略的点在于:sandbox 不是“加了就安全”,而是“不加默认全开、加了默认全锁”;它强制 origin 变为 "null",连同源判定都失效,唯一可靠通信方式只剩 postMessage,且双方都必须校验 event.origin。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











