安全沙箱需显式关闭默认能力、最小授权并配合通信与边界控制;空sandbox禁用所有脚本且静默拦截,须显式添加allow-scripts;禁止allow-same-origin,应使用postMessage通信;优先采用srcdoc内联内容,并叠加CSP等纵深防护。
实现安全沙箱环境,核心不是“加个 sandbox 就完事”,而是**显式关闭默认能力、按需最小授权、配合通信与边界控制**。直接写 `` 或 `sandbox=""` 会导致 JS 不执行、按钮无响应、表单静默失败——这不是 bug,是浏览器按规范彻底锁死。空 sandbox 状态下,所有脚本行为(包括 <script>alert(1)</script>、onclick、eval、setTimeout)全部被静默拦截,控制台不报错。要让代码跑起来,至少得:
<iframe src="sandboxed-app.html" sandbox="allow-scripts"title="安全运行环境"></iframe>
注意:
allow-scripts 只启用 JS 引擎,不恢复内联事件(如 onclick="doX()" 仍无效)<script src="trusted.js"> 或 srcdoc 中的 <script> 块加载document.write()、同步 XHR 仍被禁用,这是浏览器强制限制很多开发者误以为加 allow-same-origin 就能“方便交互”,但这是高危操作:
src 与父页协议+域名+端口完全一致时才生效;否则被忽略,还暴露配置疏漏localStorage、document、cookie,等同于绕过沙箱✅ 正确做法:保持 sandbox="allow-scripts",用 postMessage 双向受控通信
子页中:
// 向父页发送结果window.parent.postMessage({ type: 'RESULT', data: computed }, '*');
父页中:
window.addEventListener('message', (e) => {if (e.source !== iframe.contentWindow) return;if (e.origin !== 'https://trusted-domain.com') return; // 校验来源console.log('收到沙箱输出:', e.data);});
对简单代码预览(比如 AI 生成的 HTML/CSS/JS 片段),不用 src 加载远程文件,改用 srcdoc 内联:
<iframe sandbox="allow-scripts"srcdoc="<html><body><h3>预览结果</h3><script>document.body.innerHTML += '<p>运行时间: ' + new Date().toLocaleTimeString() + '</p>';parent.postMessage({ time: new Date() }, '*');</script></body></html>" title="代码片段预览"></iframe>
优势:
allow-scripts 必须显式声明)sandbox 是第一道防线,但不是银弹。生产环境还需:
referrerpolicy="no-referrer":防止 iframe 内请求泄露当前页面 URLloading="lazy":非首屏 iframe 延迟加载,减少初始攻击面Content-Security-Policy: sandbox allow-scripts; 或 X-Frame-Options: DENY:防止被他人嵌入你的沙箱页allow-same-origin 和 allow-top-navigation
不复杂但容易忽略