新增額外的 HTTP 要求標頭

HTTP 要求包含「User-Agent」或 Content-Type 等標頭。除了附加標頭外, 瀏覽器,Android 應用程式可能會透過 EXTRA_HEADERS 意圖額外項目。基於安全考量,Chrome 會篩除部分額外的標頭 取決於意圖啟動方式和位置

跨來源要求需要多一層安全措施,因為用戶端和伺服器 並非由同一方擁有。本指南說明如何透過 Chrome 啟動這類要求 自訂分頁,也就是從應用程式啟動的意圖,會在瀏覽器分頁中開啟網址。停用 Chrome 83,開發人員可以在啟動「自訂分頁」時加入任何標頭。從第 83 版起 開始篩選所有未列入核准跨來源標頭的標頭,因為未列入許可清單的標頭 暴露在安全風險中。從 Chrome 第 86 版開始,您可以將未核准的標頭附加至 跨來源請求 (在伺服器和用戶端使用 Digital 資產連結產生關聯時)。 下表摘要說明這項行為:

Chrome 版本 允許的 CORS 標頭
Chrome 83 以下版本 已加入許可清單,但未列入許可清單
Chrome 83 到 Chrome 85 已列入核准清單
(Chrome 86 以上版本) 在設定數位資產連結時,已加入許可清單,但未列入許可清單

表 1.:篩選未列入許可清單的 CORS 標頭。

本文說明如何在伺服器和用戶端之間設定已驗證連線,以及如何使用 傳送核准清單以及未列入許可清單的 http 標頭。您可以直接跳到 針對程式碼在自訂分頁意圖中加入額外的標頭

背景

核准清單與未列入核准的 CORS 要求標頭

跨源資源共享 (CORS) 可讓來自某個來源的網頁應用程式發出要求 不同來源的資源CORS-approvelisted 標頭清單會保留在 HTML 標準。已加入許可清單的標頭範例如下表所示:

標題 說明
accept-language 宣傳客戶能理解的自然語言
內容語言 描述目前目標對象的語言
內容類型 會指出資源的媒體類型

表 2.:核准列出的 CORS 標頭範例。

系統會將核准清單中的標頭視為安全,因為標頭不含敏感內容 使用者資訊,且不太可能會使伺服器執行可能破壞性的作業。

下表列舉了未列入許可清單的標頭:

標題 說明
bearer-token 在伺服器上驗證用戶端
起源 表示要求來源
餅乾 包含伺服器設定的 Cookie

表 3.:未列入許可清單的 CORS 標頭範例。

HTML 標準和伺服器不建議將未列入許可清單的標頭附加至 CORS 要求 我們會假設跨來源要求僅包含已加入許可清單的標頭。傳送未列入許可清單的標頭 來自跨來源網域的項目,可讓惡意第三方應用程式建立濫用使用者的標頭 Chrome (或其他瀏覽器) 儲存並附加至要求中的 Cookie。Cookie 可以將 驗證無法透過此方式進行的惡意伺服器交易。

將 CORS 核准清單標頭附加至自訂分頁要求

自訂分頁是一種特殊的方式,用於在自訂的瀏覽器分頁中開啟網頁。自訂分頁 意圖可使用 CustomTabsIntent.Builder() 建立您也可以附加標頭 使用帶有 Browser.EXTRA_HEADERS 標記Bundle 的意圖:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

我們隨時可以將核准清單標頭附加到自訂分頁 CORS 要求。不過,Chrome 篩選器 未列入許可清單的標頭。雖然其他瀏覽器可能會有不同的行為 開發人員應一般會封鎖未列入許可清單的標頭。

如要在自訂分頁中納入未列入許可清單的標頭,支援的做法是先驗證 使用數位存取連結進行跨來源連線下一節將說明如何設定這些 使用必要標頭啟動 Custom Tabs 意圖。

在自訂分頁意圖中加入額外標頭

如要允許未列入許可清單的標頭透過「自訂分頁」意圖傳遞,必須 為 Android 和網頁應用程式建立數位資產連結,以驗證作者 使用者擁有兩個應用程式

請按照官方指南設定數位資產連結。連結關聯的使用方式 「Delegate_permission/common.use_as_origin」表示。 驗證來源。

使用額外標頭建立自訂分頁意圖

您可以透過多種方式建立自訂分頁意圖。您可以使用 ,方法是將程式庫新增至建構依附元件:

MULTI_LINE_CODE_PLACEHOLDER_1

建立意圖並新增額外標頭:

MULTI_LINE_CODE_PLACEHOLDER_2

「自訂分頁」連線可用於設定應用程式CustomTabsSession和 Chrome 分頁。我們需要使用工作階段,驗證應用程式和網頁應用程式屬於同一來源。 只有在數位資產連結設定正確時,系統才會通過驗證。

建議您呼叫 CustomTabsClient.warmup()。可讓瀏覽器應用程式 在背景預先初始化,並加快網址開啟程序的速度。

MULTI_LINE_CODE_PLACEHOLDER_3

設定在驗證後啟動意圖的回呼

CustomTabsCallback 已傳入工作階段。我們將 onRelationshipValidationResult():啟動先前建立的 CustomTabsIntent ,待來源驗證成功後。

MULTI_LINE_CODE_PLACEHOLDER_4

繫結自訂分頁服務連線

繫結服務會啟動服務以及連線的 onCustomTabsServiceConnected() 最終都會呼叫請務必正確解除服務繫結。繫結與取消繫結 通常在 onStart()onStop() 活動生命週期方法中完成。

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

試用版應用程式程式碼

如要進一步瞭解自訂分頁服務,請參閱這篇文章。詳情請參閱 android-browser-helper GitHub 存放區找到實際範例應用程式。

摘要

本指南說明如何將任意標頭新增至自訂分頁 CORS 要求。 核准列出的標頭可以附加至每個自訂分頁 CORS 要求。未列入許可清單的標題為 CORS 要求通常會視為不安全,且 Chrome 會預設篩除這類要求。附加它們是 僅用於來源相同,並透過數位資產連結驗證的用戶端和伺服器。