HTTPQUERY
English

Permissions-Policy

用法

Permissions-Policy 响应头限制当前框架中允许使用哪些浏览器功能。每条策略将一个功能指令与一个允许列表配对,该列表定义了哪些源可以访问该功能。

Permissions-Policy: <directive>=<allowlist>

注意

推荐的初始策略会禁用站点不使用的功能:Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=()。安全扫描器会标记缺失的 Permissions-Policy 头部。设置一个最小化的策略即可解决该问题,且不影响站点功能。

注意

Permissions-Policy 机制以前称为 Feature Policy。

指令

指令名称标识要控制的浏览器功能。以下是标准化指令的一个非详尽列表:

注意

interest-cohort 指令曾用于阻止 Federated Learning of Cohorts(FLoC)。Google 于 2022 年放弃了 FLoC,并用 Topics API 取代了该 API。interest-cohort 指令已从浏览器实现中移除。

允许列表值

控制哪些源可以使用该功能:

注意

unload 指令会阻止该源的 unload 事件处理程序。设置 Permissions-Policy: unload=() 可阻止第一方代码、第三方脚本和浏览器扩展注册 unload 处理程序。这对往返缓存(bfcache)的性能意义重大,因为 unload 处理程序会阻止浏览器缓存页面,从而无法实现瞬时的前进和后退导航。Chrome 正逐步彻底弃用 unload 事件,从高流量站点开始,并逐步扩展到所有站点。设置 unload=() 会立即加入该弃用进程,无论推进时间表如何,都能保证获得 bfcache 资格。

示例

在以下示例中,服务器表明 geolocation 功能应在所有上下文中被禁用。

Permissions-Policy: geolocation=()

在以下示例中,服务器表明 encrypted-media 功能应对所有源禁用,report.example.re 除外。

Permissions-Policy: encrypted-media=("https://report.example.re")

在以下示例中,服务器表明 microphone 功能应对所有源禁用,自身以及源为 example.re 的上下文除外。

Permissions-Policy: microphone=(self "https://example.re")

阻止 unload 处理程序以提升 bfcache 资格。这可以防止第三方脚本和扩展注册会降低前进后退导航性能的 unload 事件。

Permissions-Policy: unload=()

疑难解答

Permissions-Policy 违规在多数情况下都是静默发生的,被阻止的功能会返回拒绝状态或抛出错误,而不会出现可见的浏览器提示。

功能因缺少 allow 属性而在 iframe 中被阻止。即使父页面允许某项功能,嵌入的 iframe 也需要一个显式的 allow 属性才能访问该功能。请在 iframe 标签上添加该属性:

设置策略后 Geolocation、camera 或 microphone 无法工作。诸如 Permissions-Policy: geolocation=() 之类的策略会对所有源(包括页面自身)禁用该功能。若仅允许在同源上使用该功能,请使用 geolocation=(self)。若还要允许某个特定的嵌入源,请使用 geolocation=(self “https://maps.example.re”)。对于策略已拒绝的功能,浏览器绝不会向用户发出提示。

通配符 * 对所有功能无效。某些功能不支持 * 允许列表值,仅限于显式的源列表。当 * 无效时,请逐一指定每个允许的源。请检查浏览器控制台,查看关于无法识别或不支持的允许列表值的警告。

从 Feature-Policy 迁移到 Permissions-Policy。旧版 Feature-Policy 头部使用不同的语法:Feature-Policy: geolocation ‘self’ 对应 Permissions-Policy: geolocation=(self)。当两个头部同时存在时,支持 Permissions-Policy 的浏览器会忽略 Feature-Policy。请更新头部名称并转换语法:将空格替换为 =,用圆括号包裹源列表,并去掉 self 和 none 周围的单引号(用 () 代替 ‘none’)。

使用 document.featurePolicy.allowsFeature() 进行调试。在基于 Chromium 的浏览器中,打开 DevTools 控制台并运行 document.featurePolicy.allowsFeature(‘camera’),即可检查某功能在当前上下文中是否被允许。它返回 true 或 false。对于 iframe 上下文,将源作为第二个参数传入:document.featurePolicy.allowsFeature(‘camera’, ‘https://embed.example.re’)。Firefox 使用 document.permissionsPolicy 而非 document.featurePolicy。