iframe sandbox 有什么作用?嵌入第三方页面时如何做安全隔离?
简化版
iframe sandbox 用来给 iframe 页面加限制沙箱。默认加上 sandbox 后,会禁止脚本、表单提交、弹窗、同源访问等能力;可以用 allow-scripts、allow-forms、allow-popups 等白名单逐步放开。嵌入第三方页面时,应最小授权、校验 postMessage 来源、限制 iframe 尺寸和跳转,并避免同时给不可信页面 allow-scripts 和 allow-same-origin。
详细版
iframe 是隔离第三方内容的常见方式,但默认 iframe 仍可能执行脚本、跳转或通过 postMessage 通信。sandbox 可以进一步收紧能力。
| sandbox token | 放开的能力 | 风险 |
|---|---|---|
allow-scripts | 允许脚本执行 | 可能运行恶意 JS |
allow-forms | 允许提交表单 | 可能诱导提交 |
allow-popups | 允许弹窗 | 可能钓鱼 |
allow-same-origin | 保留原始同源身份 | 和 scripts 搭配需谨慎 |
<iframe
src="https://third.example.com/widget"
sandbox="allow-scripts allow-forms"
referrerpolicy="no-referrer"
></iframe>
sandbox 的正确姿势是“默认全关,再按业务最小放开”。
完整版教学
一、为什么 iframe 需要沙箱
iframe 常用于嵌入广告、地图、支付页、报表、客服组件和第三方小工具。第三方内容不完全受你控制,一旦它执行恶意代码,可能影响用户体验或诱导用户操作。
sandbox 提供浏览器层限制,让 iframe 即使加载成功,也不能随意使用全部能力。
二、sandbox 默认限制哪些能力
只写 sandbox 不写 token 时,限制非常严格。脚本不能执行,表单不能提交,弹窗不能打开,iframe 被放到特殊 origin 中。
<iframe src="https://example.com" sandbox></iframe>
这适合纯展示内容,但很多真实业务需要逐步放开能力。
三、最小授权原则
如果第三方组件只需要展示,不要给脚本能力;如果需要脚本但不需要表单,就不要给 allow-forms。
| 场景 | 建议 |
|---|---|
| 纯展示 HTML | 只加 sandbox |
| 交互组件 | 只放开 scripts |
| 登录/支付 | 谨慎评估 forms、popups |
| 不可信内容 | 避免 same-origin + scripts |
四、为什么 allow-scripts + allow-same-origin 危险
如果 iframe 内容和父页面同源,同时给了脚本和同源能力,iframe 可能移除自己的 sandbox 或访问同源资源。
对于不可信内容,尽量使用独立域名承载,避免和主站同源。
五、postMessage 仍要校验
iframe 通信常用 postMessage。sandbox 不代表消息可信,父子页面都要校验 origin 和消息格式。
window.addEventListener('message', event => {
if (event.origin !== 'https://third.example.com') return
if (event.data?.type !== 'ready') return
})
不要用 * 发送敏感数据。
六、配合其他策略
iframe 安全还会配合:
- CSP
frame-src限制可嵌入来源。 - CSP
frame-ancestors限制自己被谁嵌入。 - Referrer-Policy 避免来源泄露。
- Permissions-Policy 限制摄像头、定位等能力。
七、常见误区与追问
- 误区:iframe 天然安全隔离,不需要额外配置。 iframe 有基础隔离,但能力仍需要 sandbox 和策略头收紧。
- 误区:sandbox token 越多越兼容越好。 token 越多,隔离越弱,应该按最小权限放开。
- 误区:加了 sandbox 就不用校验 postMessage。 消息来源和格式仍必须校验。
- 追问:为什么不可信内容最好放独立域名? 避免同源权限过大,降低访问主站 Cookie 和资源的风险。
- 追问:allow-popups 有什么风险? 可能打开钓鱼页面或滥用跳转,需要谨慎。
- 追问:父页面如何限制 iframe 来源? 用 CSP
frame-src或child-src限制。
八、加强记忆
iframe sandbox 记成“嵌入内容的权限笼子”。默认全关,按需放开;不可信内容独立域名,postMessage 必验 origin,敏感能力交给策略头一起管。