iframe 沙箱与权限策略
使用 sandbox 和 Permissions-Policy 限制嵌入内容
iframe 沙箱与权限策略 是 CoddyKit 上的免费 HTML Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 HTML Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 HTML Academy 课程共包含 4 节课。
为什么要使用沙箱内嵌框架
内嵌框架中的不可信内容(第三方组件、用户提交的 HTML 预览、嵌入式游戏)不应拥有完整的浏览器功能。sandbox 属性会限制内嵌框架能够执行的操作,从而在内容最终被证明为恶意内容时减小损害。
空沙箱 = 最大限制
<iframe sandbox src="..."> 不设置值时会应用所有限制:禁止脚本、表单、弹出窗口、顶层导航和插件,并将其视为唯一源。请以此作为起点,只添加嵌入内容实际需要的功能。
添加功能
沙箱令牌可以重新启用特定功能:sandbox="allow-scripts allow-same-origin" 允许执行脚本并访问同源内容。每个令牌都会放宽一项限制;请只组合内嵌框架实际需要的最小集合。
<iframe sandbox="allow-scripts allow-same-origin" src="https://embed.example.com/widget"></iframe>常用令牌
allow-scripts 启用 JS。allow-forms 启用表单提交。allow-popups 启用 window.open。allow-same-origin 避免将内嵌框架视为唯一源(localStorage 需要此功能)。allow-top-navigation 允许导航父窗口。
危险组合
对于同时由您托管的内嵌框架,将 allow-scripts 与 allow-same-origin 结合使用,会使内嵌框架完全访问您的源,包括移除自身沙箱的能力。仅对可信内容使用这种组合;对于不可信内容,请省略 allow-same-origin。
权限策略
权限策略(以前称为功能策略)控制页面及其内嵌框架可以使用哪些浏览器接口(摄像头、麦克风、地理位置、全屏和自动播放)。请在父页面上设置:Permissions-Policy: geolocation=() 会在所有位置阻止地理位置功能。
按内嵌框架授予权限
内嵌框架上的 allow 属性会覆盖父页面针对该内嵌框架的策略:<iframe allow="camera; microphone"> 即使父页面的默认策略拒绝这些接口,也会允许内嵌框架使用它们。
<iframe
src="https://video-call.example.com"
allow="camera; microphone; fullscreen"
sandbox="allow-scripts allow-same-origin">
</iframe>列出权限
规范中的权限列表不断变化——摄像头、麦克风、地理位置、加速计、陀螺仪、磁力计、支付、usb、midi、全屏、自动播放、画中画,以及其他几十项。请审查这份列表,并明确拒绝页面不需要的所有功能。
报告策略违规
权限策略会像 CSP 的 report-uri 一样,将违规报告发送到配置的端点。在迁移期间可以使用此功能:启用严格策略,观察哪些功能出现问题,然后针对合法功能以审慎的方式放宽策略。
源隔离
对于敏感页面,请设置 Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: require-corp。这样可以将页面与跨源窗口隔离,防范 Spectre 类时序攻击,并启用 SharedArrayBuffer。
纵深防御
Sandbox、权限策略、CSP 以及 COOP/COEP 会共同形成分层防护。每一层都能防御不同类别的攻击。嵌入第三方内容本身风险很高,因此单一缓解措施并不足够——请组合使用这些措施,让一项措施的绕过能够被另一项措施拦截。
测试
使用 Chrome DevTools 中的网络面板和问题面板,发现沙箱及权限违规。许多违规不会显示任何提示(接口只会返回 undefined 或拒绝 promise);明确的报告端点有助于在生产环境中发现这些问题。
知识检查
对于托管在您自己源上的内嵌框架,为什么 sandbox="allow-scripts allow-same-origin" 这一组合可能很危险?
总结
默认情况下为内嵌框架启用沙箱,只添加内容所需的令牌。对于不可信内容,避免使用 allow-scripts+allow-same-origin。使用权限策略在整个网站范围内拒绝强大接口,并使用内嵌框架的 allow 属性授予例外权限。结合 CSP 和 COOP/COEP,构建纵深防御。
常见问题解答
「iframe 沙箱与权限策略」课时是免费的吗?
是的 — 「iframe 沙箱与权限策略」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 HTML Academy 课程的其余内容,请升级到 CoddyKit PRO。 HTML Academy 课程共包含 4 节课。
「iframe 沙箱与权限策略」这节课中我会学到什么?
使用 sandbox 和 Permissions-Policy 限制嵌入内容 你通过在浏览器中直接运行的动手代码来练习 HTML Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 HTML Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 HTML Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「iframe 沙箱与权限策略」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 HTML Academy 课中编写并运行代码吗?
能。每节 HTML Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。