空值 sandbox="" 或仅写 sandbox 默认禁用脚本执行、表单提交、弹窗、存储访问、自动播放等所有主动行为,并强制 iframe 视为 null 源,彻底隔离于父页面。

iframe sandbox 默认禁用哪些能力
空值 sandbox="" 或仅写 sandbox,会立即切断 iframe 内几乎所有主动行为:脚本完全不执行(alert()、fetch()、addEventListener 全失效),表单点击无响应(不报错、不提交),window.open() 和 target="_blank" 被拦截,localStorage、sessionStorage、cookie 均不可读写,视频自动播放和 autofocus 也被强制禁用。
关键点在于:哪怕 src 指向同域 HTML,iframe 的 origin 也会被浏览器设为 "null",彻底隔离于父页面——这不是“限制”,而是重置了安全上下文。
allow-scripts 和 allow-same-origin 合用为什么危险
这两个 token 组合是线上最常误配的高危操作。它表面看只是“允许脚本 + 允许同源”,实际效果却是:iframe 内脚本可自由读写自身 origin 的 localStorage、发起 fetch() 请求,且一旦 src 确实与父页同源(协议+域名+端口全等),浏览器就会认可 allow-same-origin,进而让脚本能访问该 origin 下所有存储数据。
-
allow-same-origin单独存在无效:不同源时浏览器直接忽略该 token,加了也白加 - 如果 src 是
https://third-party.com/widget.html,却硬加allow-same-origin,既得不到权限,又暴露逻辑漏洞 - 即便开了这两个,iframe 仍无法访问
window.parent或document——DOM 隔离是 sandbox 的硬边界,这点常被误判
生产环境怎么配才够用又不越界
按真实功能需求选最小组合,拒绝堆砌。常见场景对应配置如下:
立即学习“前端免费学习笔记(深入)”;
- 嵌广告或数据图表(需 JS 渲染+跳转):
sandbox="allow-scripts allow-popups"—— 不开allow-forms,不碰allow-same-origin - 用户反馈表单(需填写+提交):
sandbox="allow-scripts allow-forms allow-popups"—— 提交走 CORS,不依赖同源 - 内部可信子系统(如
https://yourdomain.com/admin/):sandbox="allow-scripts allow-same-origin allow-forms"—— 必须确认 src 地址严格匹配,否则allow-same-origin失效 - 绝对禁止 iframe 跳转整个页面:别用
allow-top-navigation;真要跳,由父页监听postMessage后主动跳转
怎么验证 sandbox 是否真的生效
别靠猜,打开控制台直接查:
执行 document.querySelector('iframe').sandbox,返回的是 DOMTokenList,比如 DOMTokenList ["allow-scripts", "allow-forms"],说明当前生效的正是这两个权限。若返回空数组或 "",说明属性未正确设置或被覆盖。
动态插入的 iframe(如 React 中用 dangerouslySetInnerHTML 渲染)最容易漏掉 sandbox 属性,导致未受控内容直接执行脚本——这种边界情况线上故障率很高,但调试时往往被忽略。



















