API 安全性最佳做法

凡是使用 Google 地圖平台 API 和 SDK 的應用程式和專案,都必須具備 API 金鑰。為了提升安全性並盡可能減少工作量,建立 API 金鑰時即應設下保護限制。

雖然可在建立 API 金鑰之後及使用時再設定保護功能,但因金鑰的使用方式不同,可能會有不同的限制。在行動應用程式 (Android 和 iOS) 中更新或替換金鑰最為複雜,因為在所有客戶更新應用程式後,金鑰才會全部替換。在 JavaScript 或網路服務應用程式中更新或替換金鑰則簡單許多,但這項操作可能還是需要審慎規劃及快速執行。

如需個別 Google 地圖平台產品 (例如 Maps JavaScript API) 適用的安全性做法,請參閱「更多資訊」一節。

限制 API 金鑰

第一次建立 API 金鑰時,請設定一項應用程式限制和一或多項 API 限制來限制金鑰。

  • 應用程式限制:用來限制只能在特定平台 (Android 或 iOS) 或特定網站 (公開 IP 位址和網站) 使用 API 金鑰。任何一個 API 金鑰只能加入一種應用程式限制。

  • API 限制:用來限制只能在一或多個 Google 地圖平台 API 或 SDK 使用 API 金鑰。系統只處理已與 API 金鑰建立關聯的 API 或 SDK 使用要求。您可以視需要為任一特定 API 金鑰指定多項 API 限制。

如果您在建立 API 金鑰時並未採取安全措施,請建立其他 API 金鑰並加以限制,然後將所有應用程式更新為使用新的 API 金鑰。基於安全起見,一個應用程式使用一個金鑰是最理想的做法。不過,您還是可以對多個應用程式使用受限制的金鑰,前提是對金鑰的應用程式限制類型,與共用金鑰的應用程式兩者之間不會有相容問題。

如果您在建立 API 金鑰後才設定限制,請檢查 API 金鑰使用情況,確認這些限制不會導致任何現有應用程式無法正常運作。

  1. 前往 Google Cloud 控制台的「指標」頁面

  2. 選取「顯示篩選器」

  3. 從「分組依據」中選取「憑證」。畫面上會顯示哪些 API 金鑰與各項 Google 服務搭配使用。

  4. 按一下「憑證」

  5. 取消選取所有憑證。

  6. 對於畫面上顯示的每個金鑰,請選取金鑰並按一下「確定」

  7. 從「分組依據」中選取「API」。畫面上會顯示哪些 API 限制適用於金鑰。

    從「分組依據」中選取「API 方法」,這樣您對於哪個應用程式限制類型最適合金鑰,也許會有一些概念。

為 API 金鑰設定應用程式限制

  1. 前往「憑證」頁面
  2. 選取要設定限制的 API 金鑰,畫面隨即顯示 API 金鑰屬性頁面。

  3. 在「金鑰限制」下方,選取「應用程式限制」

    請選取其中一個限制類型,然後按照限制清單中的說明提供必要資訊。

    限制類型 說明
    HTTP 參照網址 指定一或多個參照網址網站。您可以使用萬用字元來授權所有子網域 (例如,*.google.com 接受結尾為 .google.com 的所有網站)。請依原樣指定 https://http://。您必須為其他類型的參照網址通訊協定使用特殊表示法。舉例來說,您可以將 file:///path/to/ 的格式設為 __file_url__//path/to/*。啟用參照網址後,請務必監控您的使用情況,確保符合預期。我們支援下列參照網址通訊協定:about://, app://, applewebdata://, asset://, chrome://, content://, file://, ftp://, ionic://, local://, ms-appx://, ms-appx-web://, ms-local-stream://, prism://, qrc://, res://, saphtmlp://
    IP 位址 指定一個 IPv4 或 IPv6 位址,或是採用 CIDR 標記法的子網路。網路服務要求會檢查和比較外部 IP 位址與 API 金鑰限制,因此請使用伺服器的公開 IP 位址。
    Android 應用程式 新增 AndroidManifest.xml 檔案中的 SHA-1 簽署憑證指紋和 Android 套件名稱。
    iOS 應用程式 從類型下方的清單中選取正確的 iOS 軟體包 ID。
  4. 選取「儲存」

為 API 金鑰設定 API 限制

  1. 前往「憑證」頁面

  2. 選取要設定限制的 API 金鑰。 畫面隨即顯示「限制並重新命名 API 金鑰」頁面。

  3. 在「API 限制」下方:

    • 按一下「限制金鑰」

    • 按一下「選取 API」下拉式選單,然後選擇您要讓應用程式利用 API 金鑰存取的 API 或 SDK。

      如果選單未列出您需要的 API 或 SDK,則必須啟用該 API 或 SDK。

  4. 按一下「儲存」

    這個步驟完成後,設定的限制就會成為 API 金鑰定義的一部分。但如果您未提供正確的詳細資料,或是未點選「儲存」,API 金鑰就不會受到限制。如要進一步瞭解詳情,請前往「取得 API 金鑰」指南中查看特定 API 或 SDK 的相關說明。

刪除未使用的 API 金鑰

請先確認 API 金鑰並未用於實際工作環境,再刪除該金鑰。只要沒有任何成功流量,刪除金鑰應該就不會有什麼問題。

刪除 API 金鑰的做法如下:

  1. 前往「憑證」頁面

  2. 選取要刪除的 API 金鑰。

  3. 選取靠近頁面頂端的「刪除」按鈕。

  4. 畫面出現「刪除憑證」對話方塊時,選取「刪除」

    刪除 API 金鑰需要幾分鐘的時間才會生效。生效後,凡是使用已刪除 API 金鑰的流量都會遭拒。

其他保護 API 的方法

重新產生 API 金鑰時請務必謹慎

重新產生 API 金鑰時會建立一個新金鑰,當中包含舊金鑰的所有限制。而且系統也會開始計時,並於 24 小時後停用舊版 API 金鑰。

在這段期間內,系統會同時接受新舊金鑰,讓您能將應用程式改為使用新金鑰。不過,這段期間過後,凡是使用舊版 API 金鑰的應用程式都會停止運作。

  1. 前往「API 金鑰」頁面

  2. 選取「還原為先前的金鑰」

  3. 在「還原」對話方塊中,按一下「還原金鑰」

復原後,該金鑰之前的「新」版本就會變回舊版,而系統也會重新開始計時,並於 24 小時後停用指定版本。再次重新產生金鑰之前,您可以先切換使用這兩個金鑰值。

重新產生的第二個金鑰會覆寫無效的舊金鑰值。

監控 API 使用情況

檢查 API 金鑰使用情況的做法如下:

  1. 前往「指標」頁面

  2. 按一下「顯示篩選器」

  3. 從「分組依據」選取「API 方法」

  4. 在「回應代碼」下方選取「2xx」,即可查看對這個金鑰的所有成功要求。

如果偵測到未經授權的使用情況,請執行以下操作:

  1. 限制您的金鑰。

    如有多個應用程式使用同一個金鑰,請改用多個 API 金鑰,最好針對各個應用程式使用不同的 API 金鑰

  2. 如果持續發生未經授權的使用情況,請重新產生刪除受影響的金鑰。

  3. 如需協助,請與支援團隊聯絡

針對各個應用程式使用不同的 API 金鑰

這個做法可限制每個金鑰的範圍,要是 API 金鑰遭駭,您可以直接刪除或重新產生受影響的金鑰,無須更新其他 API 金鑰。

改用多個 API 金鑰

如要從多個應用程式使用一個 API 金鑰的做法,改為每個應用程式只使用一個專屬 API 金鑰,請按照下列步驟操作:

  1. 找出需要新金鑰的應用程式。

    • 網頁應用程式最容易更新,因為所有的程式碼都是由您控制。請規劃更新所有網路應用程式的金鑰。
    • 更新行動應用程式會比較困難,因為要讓客戶先更新應用程式,您才能使用新金鑰。
  2. 請建立及限制新金鑰。

    • 新增一項應用程式限制和至少一項 API 限制。
  3. 在您的各種應用程式中加入新金鑰。

    • 就行動應用程式而言,所有使用者可能需要花上幾個月的時間,才能改為使用包含新 API 金鑰的最新應用程式。

Maps Web Service APIStatic Web API 應用程式保護方法

  • 將 API 金鑰和簽署密鑰儲存在應用程式的原始碼外。如果您將 API 金鑰或任何其他私密資訊儲存在環境變數中,或是在加入單獨儲存的檔案後共用程式碼,共用檔案中就不會包含 API 金鑰或簽署密鑰。

  • 將 API 金鑰或簽署密鑰儲存在應用程式原始碼樹狀結構外的檔案中。如果您將 API 金鑰或任何其他私密資訊儲存在檔案中,請將這類檔案存放在應用程式原始碼樹狀結構外的位置,以免金鑰出現在原始碼控管系統中。假如您使用的是公開原始碼管理系統 (例如 GitHub),特別需要注意這點。

Web Service API 或 Static Web API 行動應用程式保護方法

  • 使用 Proxy 伺服器。Proxy 伺服器提供可靠來源,讓應用程式與適當的 Google 地圖平台 API 互動。如要進一步瞭解如何使用 Proxy 伺服器,請參閱「Living Vicariously: Using Proxy Servers with the Google Data API Client Libraries」(善用代理伺服器:搭配 Google Data API 用戶端程式庫使用 Proxy 伺服器) 一文。

  • 將 API 金鑰或簽署密鑰加密或模糊處理。這樣可讓他人更難以直接從應用程式抓取 API 金鑰和其他私密資料。

更多資訊

這些表格列出各個 Google 地圖平台 API、SDK 或服務適用的 API 金鑰限制和 API 安全性最佳做法。

使用 Maps JavaScript API、Maps Embed API 或 Maps Static API 的網站

API/SDK/服務 應用程式限制 (1) API 限制 (1) 最佳做法
Maps JavaScript API (2) HTTP 參照網址限制 Maps JavaScript API
Directions Service、Maps JavaScript API HTTP 參照網址限制 Directions API、Maps JavaScript API
Distance Matrix Service、Maps JavaScript API HTTP 參照網址限制 Distance Matrix API、Maps JavaScript API
Elevation Service、Maps JavaScript API HTTP 參照網址限制 Elevation API、Maps JavaScript API
Geocoding Service、Maps JavaScript API HTTP 參照網址限制 Geocoding API、Maps JavaScript API
Maps JavaScript API Places Library HTTP 參照網址限制 Places API、Maps JavaScript API
Maps Embed API HTTP 參照網址限制 Maps Embed API
Maps Static API HTTP 參照網址限制 Maps Static API
Street View Static API HTTP 參照網址限制 Street View Static API

使用網路服務的應用程式和伺服器

API/SDK/服務 應用程式限制 (1) API 限制 (1) 最佳做法
Address Validation API IP 位址限制(4) Address Validation API
Directions API IP 位址限制(4) Directions API
Distance Matrix API IP 位址限制(4) Distance Matrix API
Elevation API IP 位址限制(4) Elevation API
Geocoding API IP 位址限制(4) Geocoding API
Geolocation API IP 位址限制(4) Geolocation API
Places API (5) IP 位址限制(4) Places API
Roads API IP 位址限制(4) Roads API
Routes API IP 位址限制(4) Routes API
Time Zone API IP 位址限制(4) Time Zone API

Android 應用程式

API/SDK/服務 應用程式限制 (1) API 限制 (1) 最佳做法
Maps SDK for Android Android 限制 Maps SDK for Android
Places SDK for Android Android 限制 Places API

iOS 應用程式

API/SDK/服務 應用程式限制 (1) API 限制 (1) 最佳做法
Maps SDK for iOS iOS 限制 Maps SDK for iOS
Places SDK for iOS iOS 限制 Places API

1 您可以將未受限制的 API 金鑰用於任何 Google 地圖平台 API 或 SDK,不過極力建議您限制 API 金鑰,尤其是在下列情況下:

  • 測試環境將設為或已設為開放給所有人檢視。

  • 採用 API 金鑰的應用程式可用於實際執行環境中。

2 針對行動應用程式,我們建議使用原生的 Maps SDK for AndroidMaps SDK for iOS

3 針對 Maps Static API 和 Street View Static API,除了 API 金鑰之外,您還需要提供數位簽章,每日地圖載入量才能超過 25,000 次。

如果是簽署要求,請檢查您每天願意允許的未簽署要求數量,然後據此調整未簽署要求的配額

4 有時候設定 IP 限制的做法可能並不實際,例如對仰賴動態 IP 位址的行動應用程式和雲端環境來說,也許就不太適用。在這類情境中使用 Maps Web Service API 時,請採用 Proxy 伺服器模糊處理來保護應用程式。

5 針對行動應用程式,我們建議使用原生的 Places SDK for AndroidPlaces SDK for iOS