瀏覽器時區洩露怎麼自查:Intl、Accept-Language 與系統設定對照

部落格 / IP 與隱私

瀏覽器時區洩露怎麼自查:Intl、Accept-Language 與系統設定對照

瀏覽器時區洩露,指的是網頁尾本直接讀取你作業系統的時區設定,不需要彈窗授權,也不受代理影響。語言同理:瀏覽器每發一個請求都會帶上 Accept-Language 頭,指令碼還能讀 navigator.languages。所以出口 IP 換到哪裡都一樣,Asia/Shanghai 和 zh-CN 還是會原樣交給網站。

這篇文章只回答一個問題:這些值具體從哪裡來、由哪個設定決定、怎麼自己查清楚。目的是隱私自查,幫你知道用代理時還有哪些系統資訊會被網站讀到。文章不討論如何偽裝環境去透過任何平臺的風控,使用各類服務時請遵守其服務條款和當地法規。

如果你想先了解時區、語言、字型和 IP 對不上分別意味著什麼,可以先讀瀏覽器指紋與環境檢測:時區、語言、字型和 IP 對不上,各自暴露了什麼。本文更偏操作:給命令、給設定位置。

網頁從哪幾個地方讀到時區和語言?

一共四個直接來源,外加一個間接來源。

來源讀取方式返回值示例需要 JavaScript 嗎
IANA 時區名Intl.DateTimeFormat().resolvedOptions().timeZoneAsia/Shanghai需要
UTC 偏移new Date().getTimezoneOffset()-480需要
語言偏好列表navigator.language、navigator.languageszh-CN、["zh-CN","zh","en"]需要
HTTP 請求頭Accept-Languagezh-CN,zh;q=0.9,en;q=0.8不需要,伺服器直接收到
字型(間接)Canvas 或 CSS 測量文字寬度,判斷某字型是否存在是否裝有常見中文字型需要

幾個容易誤解的地方:

  • getTimezoneOffset() 的符號是反的。它返回“UTC 減本地時間”的分鐘數,東八區得到 -480,不是 480。它只給偏移,不給地區,同一個偏移下有很多時區。
  • IANA 時區名的資訊量更大。Asia/Shanghai 和 Asia/Hong_Kong、Asia/Taipei 偏移相同,名字卻直接對應地區。
  • Accept-Language 是表中唯一不靠指令碼的來源。關掉 JavaScript 也擋不住,伺服器在第一個請求裡就能看到。q=0.9 這類權重表示偏好排序。
  • 字型只是旁證。裝了中文字型不代表系統語言是中文,很多英文系統也會裝。它的作用是和其他幾項一起看。

在自己電腦上怎麼讀到這些值?

開啟任意網頁,按 F12 進入控制檯(Console),貼上下面這段:

const r = Intl.DateTimeFormat().resolvedOptions();
console.table({
  timeZone: r.timeZone,
  locale: r.locale,
  offsetMinutes: new Date().getTimezoneOffset(),
  language: navigator.language,
  languages: navigator.languages.join(", "),
  dateString: new Date().toString(),
});

dateString 這一行通常帶有本地化的時區名稱,比如括號裡的“中國標準時間”,這同時暴露了時區和系統語言。

Accept-Language 要在網路面板裡看:DevTools 切到 Network,重新整理頁面,點第一個文件請求,在 Request Headers 裡找 accept-language。

這些值分別由哪裡決定?

大致規律:時區跟作業系統走,語言在不同瀏覽器裡來源不同。

時區

環境決定時區的設定命令列檢視
Windows設定 → 時間和語言 → 日期和時間;開啟“自動設定時區”時會參考定位服務tzutil /g 或 PowerShell Get-TimeZone
macOS系統設定 → 通用 → 日期與時間;“自動設定時區”同樣依賴定位readlink /etc/localtime
Linux/etc/localtime 或 timedatectl 設定;啟動程序時的 TZ 環境變數會覆蓋timedatectl、echo $TZ
Chrome / Edge跟隨系統,沒有獨立的時區設定用上面的控制檯程式碼
Firefox預設跟隨系統;開啟 privacy.resistFingerprinting 後改為報告 UTC 零偏移同上
Safari跟隨系統同上

“自動設定時區”這一項會讓時區跟著裝置的物理位置變,而不是跟著網路出口變。所以筆記本帶出門,時區可能自動改了;掛上代理,時區不會動。

Windows 的 tzutil /g 返回的是 Windows 自己的時區 ID(例如 China Standard Time),瀏覽器內部會換算成 IANA 名稱,兩者寫法不同屬於正常現象。

語言

環境navigator.languages 和 Accept-Language 來自在哪裡改
Chrome / Edge瀏覽器自己的“首選語言”列表,首次安裝時按系統語言生成設定 → 語言 → 首選語言,可以拖動排序
Firefox瀏覽器自己的網頁語言列表設定 → 常規 → 語言 → “選擇網頁顯示語言”
SafarimacOS 的首選語言列表系統設定 → 通用 → 語言與地區
Windows 系統設定 → 時間和語言 → 語言和區域 → 首選語言PowerShell Get-WinUserLanguageList、Get-Culture
macOS 系統系統設定 → 通用 → 語言與地區defaults read -g AppleLanguages、defaults read -g AppleLocale
LinuxLANG、LC_* 環境變數,以及桌面環境的區域設定locale

這裡有個常見情況:在 Chrome 裡改了首選語言,系統語言沒改,於是 navigator.languages 變了,但 new Date().toString() 裡的時區名稱、數字和日期格式可能仍是中文習慣。語言相關的訊號不止一處,改一處不等於全改。

字型

字型列表來自本機安裝的字型檔案。Linux 上可以用 fc-list :lang=zh family 看裝了哪些中文字型;Windows 在 C:\Windows\Fonts,macOS 在“字型冊”裡。網站通常不會拿到完整列表,而是逐個測試一批常見字型是否存在。字型指紋的更多原理可以看瀏覽器指紋是什麼:網站不靠 Cookie 能認出你的 20 多項特徵與自查方法。

用 cdnping /ip 做一次完整自查

控制檯只能看到瀏覽器這一側。要和出口 IP 放在一起對照,用 IP 與環境檢測 更方便:它會顯示出口 IP 的地理定位(11 個地理庫投票並給出置信度),同時檢測時區、語言和字型。指紋在本地計算,不上傳。

按下面的順序做:

  1. 在平時的狀態下開啟 /ip,不要特意改任何設定。記下出口 IP 的國家和城市、置信度,以及時區、語言、字型三項的結果。
  2. 核對出口 IP 定位是否可信。如果各地理庫說法分歧很大,先別急著下結論,地理庫本身就會不準,原因見為什麼 11 個 IP 庫給出不同位置。
  3. 對照時區與 IP 所在地。時區名對應的地區和 IP 定位相同,說明兩者一致;不同,說明網站能看出“裝置在一個地方,網路出口在另一個地方”。
  4. 對照語言列表。看第一語言是什麼、列表裡有幾種語言。列表越長、組合越少見,越容易成為區分你的特徵。
  5. 看同一頁的大陸分流和多出口結果。如果國內站點看到的是另一個 IP,那就不只是時區語言的問題了,可以讀國內網站如何看到你的真實 IP:大陸分流檢測的原理與三種結果和分流原理。
  6. 需要分享結果時,開啟隱藏 IP 的選項再生成帶水印的結果圖,不要直接截全屏。

每個檢測項具體怎麼解讀,可以參考瀏覽器環境檢測怎麼看:13 項檢測逐項解讀。

時區和 IP 對不上,一定是壞事嗎?

不一定。下面這些都是正常場景:

  • 在國外出差,沒開“自動設定時區”,系統還停在國內時區。
  • 公司網路統一從某個海外出口出去,員工時區都是本地。
  • 行動網路或企業專線的 IP 被地理庫定位到了別的城市。

從隱私角度看,問題不在於“對不上”本身,而在於你是否清楚自己暴露了什麼。如果你用代理的初衷是不讓網站知道你身在何處,那麼時區和語言仍會透露你所在的大致地區。

反過來,把時區、語言改得和出口 IP 一致,也不是本文建議的做法。一方面這會影響日常使用(日程、檔案時間、網頁顯示語言都會跟著變),另一方面,一些服務會把瀏覽器環境訊號用於安全判斷,具體規則以各平臺條款為準,請遵守服務條款和當地法規。

想少暴露一些,有哪些合理的做法?

只列對日常使用影響小、出於隱私目的的做法:

做法效果代價
精簡瀏覽器語言列表,只保留真正需要的一兩種降低語言列表的獨特性少數網站的多語言回退可能不如以前
關閉系統“自動設定時區”,手動設定常用時區避免時區隨物理位置變化暴露行程出行時需要手動調整
Firefox 開啟 privacy.resistFingerprinting時區改報 UTC 零偏移,還會降低其他指紋項的精度網頁上的時間可能顯示錯誤,部分站點行為異常
用 Tor Browser 等統一指紋的瀏覽器處理敏感瀏覽大量使用者報告相同的值速度慢,部分站點會攔截或頻繁要求驗證
一併檢查 WebRTC 和 DNS避免 IP 本身從別的通道洩漏需要逐個瀏覽器設定

最後一項通常比時區更要緊:時區只能暴露大致地區,WebRTC 洩漏可能直接暴露真實 IP。設定方法見WebRTC 洩漏怎麼關:Chrome、Firefox、Safari 設定,原理見 DNS 洩漏與 WebRTC 洩漏。

讓瀏覽器保持“普通”比讓它“隨機”更有用:東拼西湊的設定組合本身就罕見,反而更容易被區分出來。

開發者測試多語言站點時怎麼模擬時區?

如果你是在測自己網站的國際化邏輯,不需要改系統設定。Chrome DevTools 裡開啟 Sensors 面板(命令選單輸入 “Show Sensors”),可以為當前標籤頁覆蓋時區 ID 和區域設定,關掉 DevTools 即恢復。Linux 和 macOS 上也可以用 TZ=America/New_York 這樣的環境變數啟動一個單獨的瀏覽器例項做測試。

這類方法只用於開發除錯。測完後回到正常瀏覽狀態,再用 /ip 確認一遍設定沒有殘留。

相關文章

繼續閱讀