sandbox=""启用全部默认限制,脚本不执行、表单不提交、无法访问父DOM或localStorage;其采用默认拒绝原则,即使同源也强制视为跨源。

是的,sandbox 不带任何值(即 sandbox="")时,浏览器会启用全部默认限制。 这不是“部分禁用”,而是彻底切断 iframe 的主动行为能力——脚本不执行、表单不提交、不能弹窗、无法访问父页面 DOM、不能发 fetch/XHR、不能读写 localStorage,连 window.top 和 document.cookie 都拿不到。
为什么 sandbox="" 后 iframe 里 JS 完全不运行?
这不是 bug,是设计使然。HTML5 沙箱采用“默认拒绝(deny-by-default)”原则:空值代表显式要求最严隔离。即使 iframe 内容和父页同源,sandbox="" 也会强制将其视为跨源(unique origin),直接废掉同源策略下的所有信任链。
- 脚本被完全阻止加载和执行(
<script>标签无效,内联onclick也不触发) -
console.log、alert、setTimeout全部静默失效 - 哪怕只写
<iframe src="local.html" sandbox>(没等号),现代浏览器也按sandbox=""处理
常见误配:allow-scripts 却仍报错 access denied
加了 allow-scripts 但依然访问不了 window.parent 或 document.cookie?那是因为:allow-scripts 只解禁脚本执行,不恢复同源身份。要访问父页面或 cookie,必须额外加 allow-same-origin。
-
sandbox="allow-scripts"→ 脚本能跑,但仍是“陌生来源”,window.parent是null -
sandbox="allow-scripts allow-same-origin"→ 脚本能跑,且能读父页 DOM(前提是 iframe src 确实同源) -
allow-same-origin对跨域 src 无效:若src="https://evil.com/widget.js",加该 flag 会被浏览器忽略
Electron / Chromium 中的 sandbox 属性警告怎么处理?
在 Electron 渲染进程中看到类似 Warning: 'sandbox' not in known options list,通常是因为你把 sandbox 当作 WebPreferences 配置项传给了 webview 或 BrowserWindow,而不是作为 HTML 的 <iframe> 属性使用。
- ✅ 正确位置:
<iframe src="page.html" sandbox="allow-scripts"></iframe> - ❌ 错误位置:
new BrowserWindow({ webPreferences: { sandbox: true } })—— 这是主进程级沙箱开关,和 iframe 的sandbox属性无关 - Electron 12+ 默认禁用
nodeIntegration,此时allow-scripts已足够安全;若需 Node API,应改用contextIsolation: true+preload脚本
真正容易被忽略的一点:哪怕你写了 sandbox="allow-scripts allow-forms",如果 iframe 的 src 是 data URL 或 javascript: 协议,大多数浏览器仍会无视这些 allow 规则,直接应用全部限制——这是硬性安全兜底,没法绕过。

















