Chrome 有公開意圖,可針對不安全來源淘汰地理位置等強大功能,我們希望其他人也能效法。
自 Chrome 50 起,Chrome 不再支援使用 HTML5 Geolocation API 從透過不安全連線提供的網頁取得使用者位置。也就是說,發出 Geolocation API 呼叫的網頁必須透過安全的環境 (例如 HTTPS) 提供服務。
這項問題相當重要,因為它會直接影響任何需要使用地理位置 API 且未透過 https 提供服務的網站,但我們認為這項異動對所有網站使用者都有益。這篇文章應該能協助您瞭解原因,以及如何繼續處理。
何時變更名稱?
這項異動將於 Chrome 50 版 (2016 年 4 月 20 日下午 12 點,太平洋標準時間) 生效。
Chrome 開發人員工具控制台自 44 版 (2015 年 7 月 21 日發布) 起就會提供警告。
我們已發布多項公開公告,說明這項異動的理由 (以及相關討論):
- 意圖透過 HTTP 淘汰一組強大功能 (2015 年 2 月)
- 意圖淘汰透過 HTTP 存取的 Geolocation API (2015 年 11 月)
- Chrome 開發人員高峰會 (2016 年 11 月)
- Chrome Beta 版發布網誌 (2016 年 3 月 17 日)
- Chrome 狀態網站
其他來源也曾強調這一點:Mobiforge (2016 年 1 月 26 日)、Wired (2016 年 3 月 17 日)、VentureBeat (2016 年 4 月 13 日)。
我們進行這項異動的原因為何?
位置資訊屬於機密資料!您必須要求使用 HTTPS,才能保護使用者的所在位置資料隱私權。如果使用者的所在位置可從不安全的環境取得,網路上的攻擊者就會知道使用者的所在位置,這會嚴重侵害使用者隱私。
這項異動的影響對象?
這會影響目前使用 Geolocation API 的任何網頁,這些網頁是透過 HTTP (非安全) 放送。這也影響使用 Geolocation API 的 HTTPS iframe,如果這些 iframe 嵌入在 HTTP 網頁中,(您無法使用共用 HTTPS 傳遞的框架進行 polyfill)。
整個網頁應用程式是否需要使用 HTTPS?
您不必透過 HTTPS 提供整個應用程式,即可使用地理位置資訊。只有使用地理位置的網頁需要透過安全環境提供。目前安全的內容包含在 HTTPS 或 localhost 上頂層代管的任何內容。舉例來說,如果 iframe 指向安全來源,但代管在非安全來源 (http ://paul.kinlan.me/),就無法呼叫地理位置 API。
我們強烈建議您遷移至 HTTPS,因為強大的新型和現有瀏覽器功能都需要安全的來源。
這會影響本機開發作業嗎?
不應該,localhost 在規格中已宣告為「可能安全」,在本例中,透過 localhost 在頂層提供的地理位置要求仍會運作。
是否可以在執行階段偵測地理位置是否因處於不安全的環境而遭到封鎖
可以。地理位置規格定義了 PositionError 物件,會傳遞至 Geolocation API 的失敗回呼。這個物件會定義 code
和 message
屬性。
由於這個安全內容問題而發生的錯誤,會傳回 code
為 1 的「權限遭拒錯誤」。如果使用者拒絕存取權,或系統拒絕存取使用者的所在位置,就會發生這個錯誤。也就是說,你必須查看訊息,才能瞭解確切原因。
由於這項資訊可能會在日後變更,因此相當不穩定,但如果您發現「Only secure origins are allowed」字串,就表示內容不安全。
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,確保這些網頁是在安全環境中使用。
您可以使用多種備用選項,取得不受這項變更影響的使用者位置,例如 Google 地圖地理定位 API、GeoIP (這只是範例,還有其他地理位置解決方案),以及使用者輸入的郵遞區號。不過,我們強烈建議您改用 HTTPS,這是確保持續存取到地理位置的最佳做法。