页面里嵌第三方视频,iframe 的能力授权按什么放行
页面里嵌第三方视频时,iframe 的能力授权按什么放行,要分两层看:来源域名走白名单放行,能力按最小集逐项授权。这里的 iframe 指内嵌框架,即在自家页面里开出一块区域来承载别人站点的内容。来源那层管的是哪些站点的内容允许被嵌进来,能力那层管的是内容进来之后可以调用浏览器的哪些功能,两者由页面上不同的配置项承担。
嵌入第三方内容带来的是什么
内嵌框架里跑的不是静态图片,而是一段相对完整的页面。它在自己的框架上下文里执行,可以带脚本、可以申请媒体设备、也可以在条件满足时自动播放。于是视频嵌入同时牵涉两类风险:这段内容是否来自你信任的站点,以及它进来之后被允许做什么。实际配置里常见的疏忽是只盯住前一类,域名放行之后就认为工作结束了,能力那层要么全开要么全关。
来源域名为什么要走白名单
来源控制的对象是“能不能嵌”。通行的做法是维护一份允许嵌入的域名清单,清单之外的来源不渲染或者降级处理。PbootCMS 在 V3.2.18 的更新记录里完善了富文本内嵌框架的安全重建,其中对可信视频域名保留了默认的来源策略,也就是把 strict-origin-when-cross-origin 这条引用来源规则继续留给这些域名使用。这个动作的性质是加固:把已经存在的信任关系用更明确的规则固定下来。再往前翻一条记录会更清楚:V3.2.17 增强了内嵌框架的白名单,支持子域通配,并在保存内容时自动同步精确域名的条目。
能力授权为什么要按最小集给
能力控制的对象是“进来之后能用什么”。内嵌框架上有一个 allow 属性,中文可以理解成授权清单,它按逐项写出的方式声明摄像头、定位、自动播放这类能力里有哪几项对框架内容开放。容易图省事的做法是把一长串能力连着列上去,但摄像头和定位属于敏感能力,视频类内容大多用不到,多给一项就多一处可被调用的入口。V3.2.18 的处理方式是对 allow 属性做 token 白名单,这里的 token 指授权清单里逐个写出的能力名:只有落在白名单内的名字会被保留,其余的在重建环节被去掉。这样即便富文本里混进了超出预期的授权声明,留在页面上的仍然只是被认可的那组能力名。
精确域与子域通配怎么分
白名单里写精确域名还是写子域通配,是省事与稳妥之间的取舍。通配覆盖面宽,视频平台常把内容放在不同的二级子域上,一条通配就能都收进来,维护量小;代价是范围放宽之后不容易再收紧。精确域名把每一条都写死,可控性强,新增一个来源就得补一条,维护量更大。这两样出现在相邻两个版本里:V3.2.17 补上子域通配与保存时同步精确域名,V3.2.18 再对 allow 授权清单做逐项过滤。这可以读成一种分工——通配负责兜住变化频繁的子域,精确条目负责把已确认的来源单独钉牢。
| 控制的问题 | 由谁决定 | 常见做法 | 松紧影响 |
|---|---|---|---|
| 哪些站点的内容允许被嵌进来 | 来源域名清单 | 维护可信视频域名,按域名放行或拒绝 | 放宽省事但覆盖面大;收紧稳妥但要持续补条目 |
| 嵌入内容按什么规则带来源信息 | 框架的重建规则 | 对可信来源保留默认来源策略 | 保持默认让来源信息按规则携带;随意改动会让排查失准 |
| 进来之后能调用哪些能力 | allow 授权清单 | 逐项声明,只给视频确实需要的能力 | 全开省事但入口多;按最小集给要多写几项 |
常见问题
问:来源已经放行了,能力还要单独配吗?
答:要。来源清单只管这个站的内容能不能出现在框架里,能力授权管的是框架里的内容能调用哪些浏览器功能。放行一个视频域名,并不等于它需要摄像头或定位。
问:allow 属性为什么要在保存或重建环节再过一道白名单?
答:富文本里的标签可能来自粘贴、来自模板,也可能来自历史内容,写进去的授权声明不一定符合当前策略。V3.2.18 的做法是在重建环节按 token 白名单过滤,认可的能力名留下,其余去掉,让页面最终留下的授权集合和清单一致。
问:子域通配和精确域名同时存在,算不算重复?
答:不算。通配负责覆盖会变动的子域,精确条目负责把确认过的来源单独记牢。PbootCMS 在 V3.2.17 里既支持子域通配,又在保存内容时自动同步精确域名的条目,两种粒度各管一段。