瀏覽器時區洩露怎麼自查:Intl、Accept-Language 與系統設定對照
瀏覽器時區洩露,指的是網頁尾本直接讀取你作業系統的時區設定,不需要彈窗授權,也不受代理影響。語言同理:瀏覽器每發一個請求都會帶上 Accept-Language 頭,指令碼還能讀 navigator.languages。所以出口 IP 換到哪裡都一樣,Asia/Shanghai 和 zh-CN 還是會原樣交給網站。
這篇文章只回答一個問題:這些值具體從哪裡來、由哪個設定決定、怎麼自己查清楚。目的是隱私自查,幫你知道用代理時還有哪些系統資訊會被網站讀到。文章不討論如何偽裝環境去透過任何平臺的風控,使用各類服務時請遵守其服務條款和當地法規。
如果你想先了解時區、語言、字型和 IP 對不上分別意味著什麼,可以先讀瀏覽器指紋與環境檢測:時區、語言、字型和 IP 對不上,各自暴露了什麼。本文更偏操作:給命令、給設定位置。
網頁從哪幾個地方讀到時區和語言?
一共四個直接來源,外加一個間接來源。
| 來源 | 讀取方式 | 返回值示例 | 需要 JavaScript 嗎 |
|---|---|---|---|
| IANA 時區名 | Intl.DateTimeFormat().resolvedOptions().timeZone | Asia/Shanghai | 需要 |
| UTC 偏移 | new Date().getTimezoneOffset() | -480 | 需要 |
| 語言偏好列表 | navigator.language、navigator.languages | zh-CN、["zh-CN","zh","en"] | 需要 |
| HTTP 請求頭 | Accept-Language | zh-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 | 瀏覽器自己的網頁語言列表 | 設定 → 常規 → 語言 → “選擇網頁顯示語言” |
| Safari | macOS 的首選語言列表 | 系統設定 → 通用 → 語言與地區 |
| Windows 系統 | 設定 → 時間和語言 → 語言和區域 → 首選語言 | PowerShell Get-WinUserLanguageList、Get-Culture |
| macOS 系統 | 系統設定 → 通用 → 語言與地區 | defaults read -g AppleLanguages、defaults read -g AppleLocale |
| Linux | LANG、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 個地理庫投票並給出置信度),同時檢測時區、語言和字型。指紋在本地計算,不上傳。
按下面的順序做:
- 在平時的狀態下開啟 /ip,不要特意改任何設定。記下出口 IP 的國家和城市、置信度,以及時區、語言、字型三項的結果。
- 核對出口 IP 定位是否可信。如果各地理庫說法分歧很大,先別急著下結論,地理庫本身就會不準,原因見為什麼 11 個 IP 庫給出不同位置。
- 對照時區與 IP 所在地。時區名對應的地區和 IP 定位相同,說明兩者一致;不同,說明網站能看出“裝置在一個地方,網路出口在另一個地方”。
- 對照語言列表。看第一語言是什麼、列表裡有幾種語言。列表越長、組合越少見,越容易成為區分你的特徵。
- 看同一頁的大陸分流和多出口結果。如果國內站點看到的是另一個 IP,那就不只是時區語言的問題了,可以讀國內網站如何看到你的真實 IP:大陸分流檢測的原理與三種結果和分流原理。
- 需要分享結果時,開啟隱藏 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 確認一遍設定沒有殘留。