只加 sandbox 属性即彻底禁用所有 js 执行:浏览器在解析阶段直接跳过脚本加载与执行, 或 sandbox="" 使 、onclick、eval() 等全部静默失效,network 显示 net::err_blocked_by_response,控制台无报错;document.queryselector('iframe').sandbox 返回空 domtokenlist [] 即确认锁死;sandbox="allow-scripts" 是唯一可恢复外链脚本执行的配置,但仅限 (需 cors),不恢复内联脚本、事件处理器、document.write()、同步 xhr,且不赋予 dom 访问权;该属性必须静态声明,动态设置无效。

只加 sandbox 属性就等于彻底禁用所有 JS 执行
不是“部分禁用”,而是浏览器在解析阶段直接跳过脚本加载和执行逻辑。写成 <iframe sandbox src="https://third-party.com/widget.html"></iframe> 或 <iframe sandbox=""></iframe>,子页面里任何 <script></script> 标签、onclick、javascript:void(0)、eval() 全部静默失效——Network 面板会显示 net::ERR_BLOCKED_BY_RESPONSE,控制台连报错都不会有。
验证是否锁死:打开控制台执行 document.querySelector('iframe').sandbox,返回空的 DOMTokenList [] 就说明没开任何权限,JS 确实被拦在解析入口。
sandbox="allow-scripts" 是唯一能恢复外链脚本执行的配置
它只解禁通过 <script src="..."></script> 加载的外部 JS(且需服务端返回合法 CORS 头),但不会恢复以下行为:
-
onclick="alert(1)"等内联事件处理器仍被屏蔽 -
<script>console.log('inline')</script>内联脚本完全不解析 -
document.write()、同步XMLHttpRequest.open(..., false)依然被禁止 - 子页面无法访问
window.parent或读取父页 DOM,即使同源
注意:allow-scripts 必须静态写在 HTML 标签里,iframe.sandbox = "allow-scripts" 动态设置无效。
想禁用特定脚本而非全关?靠 sandbox 不行,得换思路
sandbox 是二值开关(全开/全关),没法按 URL 或函数名过滤。真要精准拦截某些脚本,得组合其他机制:
- 父页面设 CSP:
Content-Security-Policy: frame-src 'self'; script-src 'self' https://trusted.example.com'—— 它会约束 iframe 内脚本发起的后续 fetch 请求,比如阻止恶意脚本再拉https://evil.com/hook.js - 用
srcdoc替代src:把第三方 HTML 拿到手后,先用正则或 DOMParser 清洗掉目标<script src="bad.js"></script>标签,再注入srcdoc,这样连allow-scripts都不用开 - 拦截网络请求:在 Service Worker 或代理层(如 Nginx)根据 Referer 和路径规则,对已知恶意脚本 URL 返回 403
单独指望 sandbox “选择性禁用”某个脚本,是误用了它的设计定位。
容易忽略的关键点:沙箱权限不继承,也不递归
开了 sandbox="allow-scripts",只保证初始 HTML 里的 <script src="a.js"></script> 能加载;如果 a.js 里又动态创建 document.createElement('script').src = "b.js",这个 b.js 仍会被拦——allow-scripts 不授权动态注入能力。
更隐蔽的是:若子页面用 data:text/javascript,... 协议内联脚本,或通过 import() 加载模块,这些默认都不受 allow-scripts 放行,除非额外加 allow-same-origin(但那会极大扩大攻击面,生产环境应避免)。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











