在 Chrome 50 版中,將 Geolocation API 從不安全的來源移除

Paul Kinlan
Paul Kinlan

Chrome 設有公開意圖,淘汰不安全來源的地理位置等強大功能,希望其他創作者也能使用這項服務。

從 Chrome 50 版開始,Chrome 不再支援透過非安全連線傳送的網頁,使用 HTML5 Geolocation API 取得使用者的位置資訊。這表示發出 Geolocation API 呼叫的網頁必須透過安全內容 (例如 HTTPS) 提供。

這一點非常重要,因為這會直接影響任何需要使用地理位置 API 且無法透過 https 提供的網站。不過,我們認為這項改變對網路全體使用者都有幫助。這篇文章應可協助您瞭解原因和後續處理方式。

何時變更名稱?

這項異動自 Chrome 50 版起生效 (太平洋標準時間 2016 年 4 月 20 日下午 12 點)。

Chrome 的開發人員工具控制台自 2015 年 7 月 21 日推出後,就已提供警告訊息。
以下列舉幾項公開公告,說明本次異動的理由 (和討論):

還有許多其他來源也以此標示: Mobiforge (2016 年 1 月 26 日)、 Wired (2016 年 3 月 17 日)、 VentureBeat (2016 年 4 月 13 日)。

我們進行這項異動的原因為何?

位置屬於機密資料!必須使用 HTTPS 以保護使用者位置資料的隱私權。如果無法透過不安全的內容取得使用者的位置資訊,網路上的攻擊者就能得知使用者的所在位置,進而嚴重破壞使用者隱私。

這項異動的影響對象?

這會影響目前使用 Geolocation API 的任何網頁 (來自透過 HTTP (非安全) 提供) 的網頁。如果使用 Geolocation API 的 HTTPS iframe 嵌入 HTTP 網頁中,也會受到影響(您無法透過共用 HTTPS 傳送的影格來使用 polyfill)。

我的整個網頁應用程式都需要 HTTPS 嗎?

「不」必須透過 HTTPS 提供整個應用程式才能使用地理位置。只有使用 Geolocation 的網頁才能透過安全內容提供。安全內容目前是託管在 HTTPS 或 localhost 頂層的內容。舉例來說,如果 iframe 指向安全來源,但託管在不安全的來源 (http ://paul.kinlan.me/) 上代管,則不允許呼叫 Geolocation API。

由於新的瀏覽器功能需要安全來源,因此我們強烈建議您遷移至 HTTPS。

這會影響本機開發作業嗎?

這樣應該不會。localhost 已在規格中宣告為「可能安全」,在我們的案例中,透過 localhost 執行的地理位置要求仍可繼續執行。

我可以在執行階段偵測出地理位置是否因未處於安全狀態而遭到封鎖

是,地理位置規格定義了 PositionError 物件,該物件會傳入 Geolocation API 的錯誤回呼。物件會定義 codemessage 屬性。

這項安全內容問題造成的錯誤會傳回 1 的 code,屬於「權限遭拒錯誤」。當使用者拒絕存取,或系統拒絕存取使用者的位置時,您就會收到此錯誤。也就是說,您必須查看訊息,瞭解確切的原因。

這項功能日後可能會有異動,因此相當脆弱,但如果您查看「僅允許安全來源」字串,就能明顯知道這屬於不安全的內容問題。

navigator.geolocation.getCurrentPosition(success => {
    /* Do some magic. */
}, failure => {
    if (failure.message.startsWith("Only secure origins are allowed")) {
    // Secure Origin issue.
    }
});

提醒您,您不能只檢查網頁來源,因為網頁可能位於 https,但不在不安全的內容所代管的 iframe 中。

我真的需要使用地理位置,該怎麼辦?

如果您想使用 HTML5 Geolocation API,或是您的網站已使用 Geolocation API,請將進行 Geolocation API 呼叫的網頁遷移至 HTTPS,確保在安全的情況下使用這些 API。

有許多備用選項可以取得不受這項異動影響的使用者位置資訊,例如 Google Maps Geolocation APIGeoIP (例如使用其他地理區域式解決方案),以及使用者輸入的郵遞區號。不過,我們強烈建議您持續提供地理位置資訊存取權,最好的方法就是改用 HTTPS。