直接写 sandbox 或 sandbox="" 即全锁死:脚本不执行、表单失效、弹窗拦截、localstorage 报 securityerror,连 alert(1) 都不弹;浏览器在资源加载前就拒绝全部主动行为,network 显示 net::err_blocked_by_response,document.queryselector('iframe').sandbox 返回空 domtokenlist []。

直接写 sandbox 或 sandbox="" 就等于全锁死——脚本不执行、表单点不动、弹窗拦截、localStorage 报 SecurityError,连 alert(1) 都不会弹。这不是“没配好”,是浏览器压根不解析内容。
空 sandbox 属性导致白屏或 JS 完全不运行
现象包括:net::ERR_BLOCKED_BY_RESPONSE(Network 面板)、控制台静默无报错、document.querySelector('iframe').sandbox 返回空 DOMTokenList []。这不是加载失败,是沙箱在资源开始加载前就拒绝了全部主动行为。
- 所有内联脚本(
<script>alert(1)</script>)、内联事件(onclick="fetch()")、javascript:void(0)全部被静默丢弃 -
fetch()、XMLHttpRequest、document.write()、eval()均不可用 - 即使
src指向同域 HTML,iframe 的window.origin也被强制设为"null",彻底隔离 - 动态设置
iframe.sandbox = "allow-scripts"在 Chrome/Firefox 中无效,属性必须在插入 DOM 前写死
allow-scripts 是多数第三方组件的最低可行权限
广告、图表、统计 SDK 等依赖外链 JS 的组件,至少需要这个 token 才能启动。但它只解禁外链脚本,不恢复任何内联能力,也不赋予存储或 DOM 访问权。
- ✅ 可运行:
<script src="https://cdn.example.com/widget.js"></script>(需服务端返回Access-Control-Allow-Origin) - ❌ 不可运行:
<script>console.log('nope')</script>、onload="alert(1)"、data:text/javascript,alert(1) - ⚠️ 注意:
allow-scripts不递归授权——脚本里再动态插入<script></script>标签仍被拦截 - ⚠️
window.parent、document依然不可访问;localStorage绑定到临时匿名上下文,刷新即丢
allow-same-origin 和 allow-scripts 合用极易越权
这两个 token 同时出现,只在 src 与父页协议+域名+端口**完全一致**(如都是 https://yourapp.com/internal.html)时才部分生效。否则 allow-same-origin 被浏览器静默忽略,且不报错。
- 不同源时加
allow-same-origin:既得不到localStorage或cookie访问权,又暴露你未校验信任边界 - 即使同源 + 这两个 token,iframe 仍无法读取
parent.document——DOM 隔离是 sandbox 的硬边界,不可绕过 - 生产环境嵌第三方内容时,绝对禁止
allow-same-origin;仅当确认src是可信内部路径时才考虑 - 通信必须走
postMessage,且父页监听时必须校验e.origin,不能写'*'
真正安全的配置不是堆砌权限,而是按真实功能最小化放行:比如广告用 sandbox="allow-scripts allow-popups",用户表单用 sandbox="allow-scripts allow-forms",内部子系统才谨慎加 allow-same-origin。最容易被忽略的是——sandbox 必须和 referrerpolicy="no-referrer"、loading="lazy"、srcdoc 或服务端 Content-Security-Policy: frame-ancestors 配合使用,单靠它撑不起纵深防御。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











