許可權策略

許可權策略 提供了機制,允許 Web 開發人員明確宣告哪些功能可以在網站上使用,哪些功能不能使用。您可以定義一組“策略”,限制網站程式碼可以訪問哪些 API,或者修改瀏覽器針對某些功能的預設行為。這使您能夠執行最佳實踐,即使程式碼庫在不斷發展,並且可以更安全地組合第三方內容。

許可權策略類似於 內容安全策略,但它控制功能而不是安全行為。

您可以使用許可權策略執行的操作示例

  • 更改移動裝置和第三方影片上自動播放的預設行為。
  • 限制網站使用相機、麥克風或揚聲器等敏感裝置。
  • 允許 iframe 使用 全屏 API
  • 阻止在視窗中不可見的專案被指令碼化,以提高效能。

注意: 許可權策略以前稱為功能策略。名稱已更改,HTTP 標頭語法也已更改,因此如果您以前使用過功能策略,請記住這一點,並檢視瀏覽器支援表。<iframe allow=" ... ">語法保持不變。

概念和用法

網路提供了功能和 API,如果濫用,可能會存在隱私或安全風險。在這種情況下,您可能希望嚴格限制如何在網站上使用功能。在每種情況下,都應有一種直觀或不中斷的方式讓 Web 開發人員檢測和處理功能被停用的情況。

一些方法包括

  • 對於需要使用者許可權授予的 JavaScript API,將返回“許可權被拒絕”。
  • 提供對功能訪問許可權的 JavaScript API 返回false 值或丟擲錯誤。
  • API 甚至不會公開,就好像它們不存在一樣。
  • 控制功能行為的選項具有不同的預設值。

注意: 新引入的功能可能具有明確的 API 來發出訊號狀態。後來與許可權策略整合的現有功能通常會使用現有機制。

許可權策略允許您控制哪些來源可以使用哪些功能,無論是在頂層頁面還是在嵌入式 <iframe> 中。目標是執行良好使用者體驗的最佳實踐,並提供對敏感強大功能的粒度控制(即需要使用者明確授權才能使用其相關程式碼才能執行的功能)。

許可權策略提供兩種指定策略的方法

這些是獨立但相關的 - 請參閱 嵌入式內容的策略繼承 瞭解更多詳細資訊。

注意: 指令碼可以透過 FeaturePolicy 物件以程式設計方式查詢有關許可權策略的資訊,該物件位於 Document.featurePolicyHTMLIFrameElement.featurePolicy 中。

要控制每個功能,您需要編寫一個策略,該策略包含

  • 一個指令,用於標識要控制的功能的名稱。請參閱 不同可用指令的列表
  • 一個允許列表,這是一個應控制功能的來源列表。您可以為所有來源或特定來源啟用功能,或阻止其在所有來源中的使用。

請參閱以下多個示例。

與許可權 API 的關係

許可權策略和 許可權 API 緊密相關,但不同。這些技術控制其許可權的功能重疊。

  • 許可權策略允許伺服器設定功能是否可以在特定文件(或其中的嵌入式 <frame>)中使用。這些被稱為策略控制功能 - 請參閱 許可權策略指令列表
  • 許可權 API 根據使用者授予的許可權來控制對功能的訪問。這些功能記錄在 許可權登錄檔 中。

用於每個功能的標識字串在兩者之間保持一致,例如,對於 地理定位 API,使用 geolocation。許可權登錄檔中的大多數 API 功能也都有相應的許可權策略指令。一個例外是 通知 API

通常,當權限策略阻止使用強大功能時,甚至不會要求使用者授予使用許可權,並且許可權 API query() 方法將返回 statedenied

另請參閱 許可權 > 與許可權策略規範的關係

允許列表

允許列表是包含一個或多個以下值的來源列表,這些值包含在括號中,並用空格隔開

  • *:此文件中以及所有巢狀瀏覽上下文(<iframe>)中(無論其來源如何)都將允許使用該功能。
  • ()(空允許列表):在頂層和巢狀瀏覽上下文中停用該功能。對於 <iframe> allow 屬性,等效項是 'none'
  • self:此文件中以及所有巢狀瀏覽上下文(<iframe>)中(僅在同一來源中)將允許使用該功能。在巢狀瀏覽上下文中,跨來源文件中不允許使用該功能。self 可以被視為 https://your-site.example.com 的簡寫。對於 <iframe> allow 屬性,等效項是 'self'
  • 'src':只要載入到其中的文件來自其 src 屬性中 URL 的同一來源,該功能就在此 <iframe> 中允許使用。此值僅在 <iframe> allow 屬性中使用,並且是 <iframe> 中的預設允許列表值。
  • "<origin>":該功能對於特定來源是允許的(例如,"https://a.example.com")。來源應使用空格隔開。請注意,<iframe> 允許屬性中的來源沒有引號。

*() 只能單獨使用,而 selfsrc 可以與一個或多個來源結合使用。

注意: 指令具有預設允許列表,對於 Permissions-Policy HTTP 標頭,該列表始終是 *selfnone 之一,並且在策略中未明確列出時,它會控制預設行為。這些在各個 指令參考頁 上指定。對於 <iframe> allow 屬性,預設行為始終是 src

在支援的情況下,您可以在許可權策略來源中包含萬用字元。這意味著,您不必在允許列表中明確指定幾個不同的子域,而可以將它們全部指定在具有萬用字元的單個來源中。

因此,您可以指定以下內容,而不是

http
("https://example.com" "https://a.example.com" "https://b.example.com" "https://c.example.com")

您可以指定

http
("https://example.com" "https://*.example.com")

注意: "https://*.example.com" 不匹配 "https://example.com"

允許列表示例

  • *
  • ()
  • (self)
  • (src)
  • ("https://a.example.com")
  • ("https://a.example.com" "https://b.example.com")
  • (self "https://a.example.com" "https://b.example.com")
  • (src "https://a.example.com" "https://b.example.com")
  • ("https://*.example.com")

Permissions-Policy 報頭語法

一般語法如下所示

http
Permissions-Policy: <directive>=<allowlist>

例如,要阻止對地理定位的所有訪問,您可以執行以下操作

http
Permissions-Policy: geolocation=()

或者,要允許訪問一部分來源,您可以執行以下操作

http
Permissions-Policy: geolocation=(self "https://a.example.com" "https://b.example.com")

透過使用逗號分隔的策略列表傳送標頭或為每個策略傳送單獨的標頭,可以同時控制多個功能。

例如,以下操作是等效的

http
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> 要啟用其允許來源的功能,該來源也必須位於父頁面的允許列表中。由於這種 繼承行為,最好在 HTTP 標頭中指定功能的最廣泛可接受支援,然後在每個 <iframe> 中指定您需要的支援子集。

一般語法如下所示

html
<iframe src="<origin>" allow="<directive> <allowlist>"></iframe>

例如,要阻止對地理定位的所有訪問,您可以執行以下操作

html
<iframe src="https://example.com" allow="geolocation 'none'"></iframe>

要將策略應用於當前來源和其他來源,您可以執行以下操作

html
<iframe
  src="https://example.com"
  allow="geolocation 'self' https://a.example.com https://b.example.com"></iframe>

這一點很重要:預設情況下,如果 <iframe> 導航到另一個來源,則不會將策略應用於 <iframe> 導航到的來源。透過在 allow 屬性中列出 <iframe> 導航到的來源,應用於原始 <iframe> 的許可權策略將應用於 <iframe> 導航到的來源。

透過在 allow 屬性中包含用分號分隔的策略指令列表,可以同時控制多個功能。

html
<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值,因此以下等效

html
<iframe src="https://example.com" allow="geolocation 'src'">
  <iframe src="https://example.com" allow="geolocation"></iframe
></iframe>

注意:正如您所注意到的,<iframe>策略的語法與Permissions-Policy標頭的語法略有不同。前者仍然使用與舊的 Feature Policy 規範相同的語法,該規範已被 Permissions Policy 取代。

圍欄幀和許可權策略

<fencedframe><iframe>以相同的方式與許可權策略互動,但功能更加受限。只有專門設計用於<fencedframes>的功能才能透過為其設定的許可權策略啟用;在此上下文中其他受策略控制的功能不可用。

有關更多詳細資訊,請參閱圍欄幀可用的許可權策略

嵌入式內容的策略繼承

指令碼會繼承其瀏覽上下文的策略,無論其來源如何。這意味著頂級指令碼會從主文件繼承策略。

所有<iframe>都會繼承其父頁面的策略。如果<iframe>具有allow屬性並且父頁面具有Permissions-Policy,則會結合父頁面的策略和allow屬性,使用最嚴格的子集。要啟用<iframe>的功能,其來源必須同時存在於父頁面的允許列表和allow屬性中。

在策略中停用功能是單向切換。如果父幀已為子幀停用了某項功能,則子幀無法重新啟用該功能,其任何後代也無法重新啟用。

示例

組合 HTTP 標頭和<iframe>策略

例如,假設我們想在自己的來源和來自我們信任的廣告網路的嵌入內容中啟用地理位置使用。我們可以這樣設定頁面範圍的許可權策略

http
Permissions-Policy: geolocation=(self "https://trusted-ad-network.com")

在我們自己的廣告<iframe>中,我們可以這樣設定對https://trusted-ad-network.com來源的訪問

html
<iframe src="https://trusted-ad-network.com" allow="geolocation"></iframe>

如果其他來源最終載入到<iframe>中,它將無法訪問地理位置。

html
<iframe src="https://rogue-origin-example.com" allow="geolocation"></iframe>

規範

規範
許可權策略
# permissions-policy-http-header-field

瀏覽器相容性

BCD 表格僅在瀏覽器中載入

另請參見