权限策略
语法
Permissions-Policy: <directive>=<allowlist>
<directive>
-
要应用
allowlist
的权限策略指令。有关允许的指令名称列表,请参见下面的 指令。 <allowlist>
-
允许列表是一个包含一个或多个以下值的列表,这些值包含在括号中,并用空格隔开
*
:该功能将在本文档以及所有嵌套的浏览上下文 (<iframe>
) 中被允许,无论其来源如何。()
(空允许列表):该功能在顶级和嵌套的浏览上下文中被禁用。对于<iframe>
allow
属性,等效项是'none'
。self
:该功能将在本文档以及所有与本文档来源相同的嵌套浏览上下文 (<iframe>
) 中被允许。该功能在嵌套浏览上下文中的跨来源文档中不被允许。self
可以被视为https://your-site.example.com
的简写。对于<iframe>
allow
属性,等效项是self
。src
:该功能将在该<iframe>
中被允许,只要加载到其中的文档来自其 src 属性中 URL 的相同来源。此值仅用于<iframe>
allow
属性,并且是<iframe>
中的默认allowlist
值。"<origin>"
:该功能允许特定来源(例如,"https://a.example.com"
)。来源之间应使用空格隔开。请注意,<iframe>
允许属性中的来源没有引号。
*
和()
值只能单独使用,而self
和src
可以与一个或多个来源结合使用。注意: 指令有一个默认允许列表,它始终是
Permissions-Policy
HTTP 头部的*
、self
或none
之一,并在它们没有明确列在策略中时控制默认行为。这些在各个 指令参考页面 上指定。对于<iframe>
allow
属性,默认行为始终是src
。
在支持的情况下,您可以在权限策略来源中包含通配符。这意味着,您不必在允许列表中显式指定多个不同的子域,而是在一个带有通配符的来源中指定它们。
所以,代替
("https://example.com" "https://a.example.com" "https://b.example.com" "https://c.example.com")
您可以指定
("https://example.com" "https://*.example.com")
注意: "https://*.example.com"
不匹配 "https://example.com"
。
指令
accelerometer
Experimental-
控制当前文档是否被允许通过
Accelerometer
接口收集有关设备加速度的信息。 ambient-light-sensor
Experimental-
控制当前文档是否被允许通过
AmbientLightSensor
接口收集有关设备周围环境光线量的信息。 attribution-reporting
Experimental-
控制当前文档是否被允许使用 归因报告 API。
autoplay
Experimental-
控制当前文档是否被允许自动播放通过
HTMLMediaElement
接口请求的媒体。当此策略被禁用且没有用户手势时,由Promise
返回的HTMLMediaElement.play()
将使用NotAllowedError
DOMException
拒绝。<audio>
和<video>
元素上的自动播放属性将被忽略。 bluetooth
Experimental-
控制是否允许使用 Web 蓝牙 API。当此策略被禁用时,由
Navigator.bluetooth
返回的Bluetooth
对象的方法将返回false
或拒绝返回的Promise
,并使用SecurityError
DOMException
。 browsing-topics
Experimental Non-standard-
控制对 主题 API 的访问。如果策略明确禁止使用主题 API,则任何尝试调用
Document.browsingTopics()
方法或发送带有Sec-Browsing-Topics
头部的请求都将失败,并使用NotAllowedError
DOMException
。 camera
-
控制当前文档是否被允许使用视频输入设备。当此策略被禁用时,由
Promise
返回的getUserMedia()
将使用NotAllowedError
DOMException
拒绝。 compute-pressure
Experimental-
控制对 计算压力 API 的访问。
display-capture
-
控制当前文档是否被允许使用
getDisplayMedia()
方法捕获屏幕内容。当此策略被禁用时,如果未获得捕获显示内容的权限,则由getDisplayMedia()
返回的 promise 将使用NotAllowedError
DOMException
拒绝。 document-domain
Experimental-
控制当前文档是否被允许设置
document.domain
。当此策略被禁用时,尝试设置document.domain
将失败,并导致抛出SecurityError
DOMException
。 encrypted-media
Experimental-
控制当前文档是否被允许使用 加密媒体扩展 API (EME)。当此策略被禁用时,由
Promise
返回的Navigator.requestMediaKeySystemAccess()
将使用SecurityError
DOMException
拒绝。 fullscreen
-
控制当前文档是否被允许使用
Element.requestFullscreen()
。当此策略被禁用时,返回的Promise
将使用TypeError
拒绝。 gamepad
Experimental-
控制当前文档是否被允许使用 游戏手柄 API。当此策略被禁用时,对
Navigator.getGamepads()
的调用将抛出SecurityError
DOMException
,并且gamepadconnected
和gamepaddisconnected
事件将不会触发。 geolocation
-
控制当前文档是否被允许使用
Geolocation
接口。当此策略被禁用时,对getCurrentPosition()
和watchPosition()
的调用将导致这些函数的回调使用PERMISSION_DENIED
的GeolocationPositionError
代码调用。 gyroscope
Experimental-
控制当前文档是否被允许通过
Gyroscope
接口收集有关设备方向的信息。 hid
Experimental-
控制当前文档是否被允许使用 WebHID API 连接到不常见或奇特的 human interface device,例如备用键盘或游戏手柄。
identity-credentials-get
Experimental-
控制当前文档是否允许使用 联合凭据管理 API (FedCM),更具体地说,使用带有
identity
选项的navigator.credentials.get()
方法。如果此策略禁止使用 API,则get()
调用返回的Promise
将会拒绝并抛出NotAllowedError
DOMException
。 idle-detection
实验性功能-
控制当前文档是否允许使用 空闲检测 API 来检测用户何时与设备交互,例如在聊天应用程序中报告“在线”/“离线”状态。
local-fonts
实验性功能-
控制当前文档是否允许通过
Window.queryLocalFonts()
方法收集用户本地安装的字体信息(另请参阅 本地字体访问 API)。 magnetometer
实验性功能-
控制当前文档是否允许通过
Magnetometer
接口收集有关设备方向的信息。 microphone
-
控制当前文档是否允许使用音频输入设备。当此策略被禁用时,
Promise
将会拒绝并抛出NotAllowedError
DOMException
。 midi
实验性功能-
控制当前文档是否允许使用 Web MIDI API。当此策略被禁用时,
Promise
将会拒绝并抛出SecurityError
DOMException
。 otp-credentials
实验性功能-
控制当前文档是否允许使用 WebOTP API 从应用程序服务器发送的格式特殊的 SMS 消息中请求一次性密码 (OTP),即通过
navigator.credentials.get({otp: ..., ...})
。 payment
实验性功能-
控制当前文档是否允许使用 支付请求 API。当此策略被启用时,
PaymentRequest()
构造函数将会抛出SecurityError
DOMException
。 picture-in-picture
实验性功能-
控制当前文档是否允许通过相应的 API 以画中画模式播放视频。
publickey-credentials-create
实验性功能-
控制当前文档是否允许使用 Web 身份验证 API 创建新的非对称密钥凭据,即通过
navigator.credentials.create({publicKey: ..., ...})
。 publickey-credentials-get
-
控制当前文档是否允许使用 Web 身份验证 API 检索已存储的公钥凭据,即通过
navigator.credentials.get({publicKey: ..., ...})
。 screen-wake-lock
-
控制当前文档是否允许使用 屏幕唤醒锁定 API 来指示设备不应关闭或调暗屏幕。
serial
实验性功能-
控制当前文档是否允许使用 Web 串行 API 与串行设备进行通信,无论是直接通过串行端口连接,还是通过模拟串行端口的 USB 或蓝牙设备连接。
speaker-selection
实验性功能-
控制当前文档是否允许使用 音频输出设备 API 列出和选择扬声器。
storage-access
实验性功能-
控制加载在第三方上下文中的文档(即嵌入在
<iframe>
中)是否允许使用 存储访问 API 请求访问非分区 Cookie。 usb
实验性功能-
控制当前文档是否允许使用 WebUSB API。
-
控制当前文档是否允许使用
Navigator.share()
或 Web 共享 API 来将文本、链接、图片和其他内容共享到用户选择的任意目的地,例如移动应用程序。 window-management
实验性功能-
控制当前文档是否允许使用 窗口管理 API 来管理多个显示器上的窗口。
xr-spatial-tracking
实验性功能-
控制当前文档是否允许使用 WebXR 设备 API 与 WebXR 会话进行交互。
示例
基本用法
Permissions-Policy 标头
要允许所有来源访问地理位置,您可以执行以下操作
Permissions-Policy: geolocation=*
或者,要允许访问一组来源,您可以执行以下操作
Permissions-Policy: geolocation=(self "https://a.example.com" "https://b.example.com")
通过发送包含以逗号分隔的策略列表的标头或为每个策略发送单独的标头,可以同时控制多个功能。
例如,以下等效
Permissions-Policy: picture-in-picture=(), geolocation=(self https://example.com/), camera=*
Permissions-Policy: picture-in-picture=()
Permissions-Policy: geolocation=(self https://example.com/)
Permissions-Policy: camera=*
iframe
对于 <iframe>
要启用某个功能,其允许来源也必须在父页面的允许列表中。由于这种 继承行为,建议在 HTTP 标头中指定功能最广泛的可接受支持,然后在每个 <iframe>
中指定所需的子集支持。
要允许所有来源访问地理位置,您可以执行以下操作
<iframe src="https://example.com" allow="geolocation *"></iframe>
要将策略应用于当前来源和其他来源,您可以执行以下操作
<iframe
src="https://example.com"
allow="geolocation 'self' https://a.example.com https://b.example.com"></iframe>
这一点很重要:默认情况下,如果 <iframe>
导航到另一个来源,则不会将策略应用于 <iframe>
导航到的来源。通过在 allow
属性中列出 <iframe>
导航到的来源,应用于原始 <iframe>
的权限策略将应用于 <iframe>
导航到的来源。
可以通过在 allow
属性中包含以分号分隔的策略指令列表,同时控制多个功能。
<iframe
src="https://example.com"
allow="geolocation 'self' https://a.example.com https://b.example.com; fullscreen 'none'"></iframe>
值得特别提及的是 src
值。我们上面提到过,使用此允许列表值意味着此 <iframe>
中将允许关联的功能,只要加载到其中的文档来自与其 src 属性中的 URL 相同的来源。此值是 allow
中列出的功能的默认allowlist
值,因此以下等效
<iframe src="https://example.com" allow="geolocation 'src'">
<iframe src="https://example.com" allow="geolocation"></iframe
></iframe>
拒绝访问强大功能
SecureCorp Inc. 想要在应用程序中禁用麦克风(例如 MediaDevices.getUserMedia()
)和 Geolocation
API。它可以使用以下响应标头来实现这一点
Permissions-Policy: microphone=(), geolocation=()
通过为来源列表指定 ()
,指定的功能将被禁用,适用于所有浏览上下文(包括所有 <iframe>
),无论其来源如何。
组合 HTTP 标头和 <iframe>
策略
例如,假设我们想要在自己的来源和来自我们信任的广告网络的嵌入内容中启用地理位置使用。我们可以这样设置页面范围的权限策略
Permissions-Policy: geolocation=(self https://trusted-ad-network.com)
在我们的广告 <iframe>
中,我们可以这样设置对 https://trusted-ad-network.com
来源的访问权限
<iframe src="https://trusted-ad-network.com" allow="geolocation"></iframe>
如果其他来源最终加载到 <iframe>
中,则它将无法访问地理位置
<iframe src="https://rogue-origin-example.com" allow="geolocation"></iframe>
规范
规范 |
---|
权限策略 # permissions-policy-http-header-field |
浏览器兼容性
BCD 表仅在浏览器中加载