先记住这个答案
空的 <iframe sandbox> 一次开启多种限制,脚本执行、表单提交和顶层导航等默认都受约束;只有确有需求才逐项加放行令牌。尤其是同源嵌入若同时允许脚本与同源能力,子页面可能移除沙箱属性后重载,隔离价值大幅降低。审核嵌入内容时应先确定它来自哪儿、需要做什么,再给最少权限。
- 空
sandbox默认限制能力 - 令牌逐项放行所需功能
- 同源加脚本有逃逸风险
- 不可信内容宜放独立域
第三方演示逐项开放权限
产品要展示第三方在线演示,不希望它随意跳转顶层页面。先加 sandbox,然后测试演示是否确实需要脚本、下载或弹窗,逐项加令牌。不要直接复制 allow-scripts allow-same-origin allow-top-navigation 这一大串权限;每放开一个限制都要知道对应功能。若嵌入的是本域不可信内容,尤其要避开脚本和同源同时放行,最好把不可信内容放在独立域。
<iframe
src="https://example.org/demo"
title="交互演示"
sandbox="allow-scripts allow-forms"
loading="lazy">
</iframe>
<!-- 没有放行顶层导航与同源能力 -->sandbox 标志在嵌入文档导航加载时生效,令牌是从默认限制中开例外。
示例没有给 allow-same-origin,被嵌页面即使 URL 来自看似可信的站点,也不能按普通同源页面的方式访问存储和父窗口。这可能让依赖 cookie 或 localStorage 的第三方演示无法工作;正确做法是先确认它是否真的需要这些能力,再评估来源和隔离目标。若无法在权限收紧后运行,应考虑服务端转码、静态预览或独立域名,而不是一路把沙箱令牌全部打开。
同源脚本组合可能破坏隔离
allow-scripts 允许运行脚本,allow-forms 允许表单提交,allow-popups 允许弹窗;不同令牌不应互相推断。未给 allow-same-origin 时,文档会处于特殊的隔离来源条件。若本来与父页同源,又同时允许脚本和同源,嵌入页可以移除 sandbox 属性后重新加载,从而逃出限制。修改属性也不会神奇地改变当前已加载文档的全部隔离状态。
若嵌入的是第三方报价工具,先列出必需动作:只展示内容也许不需要脚本,表单提交才需要 allow-forms,下载则可能另需对应令牌。每多给一项权限,都应在目标浏览器中验证真实需求;因为子页面可能更新,权限越宽,后续风险越难控制。沙箱也不代替来源信任判断,第三方页面仍可能展示误导内容或收集用户输入。
容易答错的地方
- 把
sandbox当成一个开关,后面全放行 - 令牌是逐项授权;开得过多会消掉原本想要的隔离。
- 认为同源嵌入加脚本和同源仍绝对安全
- 这组权限让同源嵌入页有机会移除 sandbox 并重新加载,应避免用于不可信内容。
面试官还会怎么问?
为什么加了 allow-scripts 页面表单仍不能提交?
脚本与表单是不同限制,还需按需求考虑 allow-forms。
可以靠 sandbox 保护父页面中的秘密吗?
它是浏览器隔离手段之一;不可信内容还应单独域部署,并避免向其传敏感数据。
改掉 iframe 的 sandbox 属性会立即解除已加载页的限制吗?
沙箱标志在导航时确定,通常需要重新导航才会按新令牌加载。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。