加了sandbox属性即全锁死脚本执行,连alert(1)都不触发;必须静态设置sandbox="allow-scripts"才能运行外链脚本,内联script、onclick、eval等仍被静默屏蔽。

加了 sandbox 属性就自动禁用所有脚本执行——不是“限制”,是“不解析”,连 alert(1) 都不会触发,控制台也静默无提示。想让脚本跑起来,必须显式写 sandbox="allow-scripts",且该属性必须在 DOM 插入前就存在。
为什么写了 sandbox 却连内联 script 都不执行?
因为 sandbox(含空值 sandbox="" 或仅 sandbox)会强制浏览器跳过整个脚本解析流程:所有 <script> 标签、onclick、javascript:void(0)、eval()、setTimeout("...") 全部被静默丢弃,Network 面板里甚至看不到请求发出。
-
sandbox=""、sandbox=" "、<iframe sandbox>三者效果完全一致,都是全锁死 - 动态设置
iframe.sandbox = "allow-scripts"无效,DOM 插入后改属性不生效 - 验证当前权限:在控制台执行
document.querySelector('iframe').sandbox,返回空DOMTokenList []表示没开任何权限
sandbox="allow-scripts" 能跑什么、不能跑什么?
allow-scripts 只放行通过 <script src="..."></script> 加载的外部脚本,且该资源需满足 CORS 或同源;它不恢复任何内联执行能力,也不递归授权。
- ✅ 可运行:
<script src="https://trusted.example/widget.js"></script>(服务端需返回Access-Control-Allow-Origin) - ❌ 不可运行:
<script>console.log('nope')</script>(内联 script 静默忽略) - ❌ 不可运行:
<button onclick="fetch('/api')">click</button>(内联事件处理器完全失效) - ❌ 不可运行:
<script src="data:text/javascript,alert(1)"></script>(data:协议默认被拦) - ⚠️ 外链脚本里再调
document.write("<script></script>")或动态appendChild新 script,仍被禁止
哪些 allow-* 组合实际可用、哪些绝对要避开?
按最小权限原则配,拒绝堆砌。生产环境嵌第三方内容时,allow-same-origin 和 allow-top-navigation 基本等于关掉沙箱。
立即学习“前端免费学习笔记(深入)”;
- 仅展示广告/图表:
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"(确认 URL 真同源) - 绝对不要写:
sandbox="allow-scripts allow-same-origin allow-popups allow-forms allow-top-navigation"——这和没加sandbox几乎一样危险 - 常见误写:
sandbox="allow-scripts, allow-forms"(逗号导致allow-forms被忽略)
为什么 allow-same-origin 加了也没用?
allow-same-origin 不是“信任开关”,而是一个条件触发器:只有当 iframe 的 src 与父页面**协议 + 域名 + 端口完全一致**时,该 token 才被浏览器认可;否则直接忽略。
- 父页是
https://app.example.com:8080/dashboard,iframe src是https://api.example.com/widget.html→ 子域名不同,allow-same-origin无效 - 即使加了
allow-same-origin,iframe 内 JS 依然无法访问window.parent或修改父页面 DOM,这是 sandbox 的硬隔离边界 - 生产环境嵌第三方内容(广告、评论框、用户上传 HTML)时,绝对不要加
allow-same-origin——这相当于主动放弃来源隔离
最易被忽略的是:权限组合必须静态声明、空格分隔、不能带逗号;allow-scripts 后仍需配合 CSP 的 script-src 控制外链脚本后续 fetch 行为;而一旦开了 allow-same-origin,哪怕只用于内部同源页,也要同步确认父页本身没有 XSS 漏洞——否则 iframe 可被劫持为攻击跳板。



















