全部文章

检测与排查

浏览器时区与 IP 不一致:原因与修复

时区和 IP 对不上,是网站最容易看到的代理痕迹。讲清网站怎么读时区、为什么会错位,以及怎样让两者始终一致。

作者 Mango Team发布于 5 分钟阅读

代理出口在法兰克福,浏览器却报告 Asia/Shanghai。对网站来说,这两个事实出现在同一个请求里,拼出的故事是普通访客不会有的:网络在德国,电脑时钟却快了八个小时。这篇讲清网站怎么读你的时区、时区和 IP 错位的五种原因,以及该改什么才能让两者说的是同一个地方。

网站怎么读你的时区

不需要任何权限弹窗,两行 JavaScript 就够了:

Intl.DateTimeFormat().resolvedOptions().timeZone; // "Asia/Shanghai"
new Date().getTimezoneOffset(); // -480(比 UTC 快 480 分钟)

第一行返回操作系统设置的 IANA 时区名,第二行返回当前日期的时差,会随夏令时变化。网站两个都读,因为只改了时区名却忘了调时差的伪装,一眼就能看出来。

IP 那一半来自地理位置数据库。网站查一下发出请求的地址,得到国家、地区和该地区使用的时区,再和浏览器报告的时区比较。两边说的是同一个地方,什么都不会发生;对不上,多数风控系统会把它当作「在用代理或 VPN」的最强单一线索,因为几乎没有人会因为走了个隧道就去改电脑时钟。

错位的五种原因

你看到的可能原因在哪里修
浏览器时区是你家,IP 在代理所在国操作系统的时钟从来没改过系统设置,或浏览器环境
同一个国家,不同时区横跨多个时区的大国(美国、俄罗斯、澳大利亚)对齐代理所在城市,而不只是国家
IP 对应的时区与代理实际位置不符地理位置数据库过时换代理,或接受数据库的判断
时区在不同会话之间来回变笔记本自动设置时区,或 VPN 更换了出口固定时区和出口
时区是 UTC服务器、容器或自动化环境设一个真实时区

一、时钟还留在家里

这是最常见的情况。你给浏览器或系统加了代理,系统时钟却还是本地时区。于是每个网站看到的都是德国 IP 配中国时钟。解决办法有两个:用这个代理期间把操作系统时区改过去,或者使用时区与操作系统无关、可以单独设置的浏览器环境。

二、国家对了,时区错了

洛杉矶的美国代理配上 America/New_York 的浏览器,是同一个国家内部的三小时错位。很多风控系统比较的是时区或时差,而不是国家,所以「大致对」仍然是「不一致」。选出口所在城市的时区。

三、错的是数据库,不是你

IP 地理位置是商业数据库维护的最佳猜测。移动运营商的地址段、刚被重新分配的机房地址段,以及部分住宅地址段,会被放到错误的城市,偶尔是错误的国家。如果两家查询服务对你的代理位置说法不一,你访问的网站也会说法不一。你这边无法修复,只能换一个主流数据库都把它放对位置的代理。

四、有东西在不停地改它

开了「自动设置时区」的笔记本会根据定位服务和 Wi-Fi 线索更新时区,可能在会话进行到一半时翻转。有些 VPN 应用会在不通知你的情况下轮换出口。两种情况下,昨天一致的配置今天就不一致了,而且这段变化的历史,对你全程保持登录的网站来说是可见的。

五、全是 UTC

服务器、容器和无头自动化经常跑在 UTC 上,因为没人设过别的。真人几乎不会生活在 UTC 时区。UTC 时区配住宅 IP,是「脚本而不是人」的经典特征。

时差必须跟着时区一起动。

设好时区名只完成了一半。getTimezoneOffset() 必须返回该日期正确的值,包括夏令时的变化。七月份报告 Europe/Berlin 却给出 −60 时差的浏览器,等于告诉网站自己在撒谎。

正确的检测方法

  1. 用你实际使用的代理打开实验室。时区一行会把浏览器报告的时区和 IP 解析出的时区并排显示。
  2. 顺便看语言一行。德国 IP、德国时区,浏览器却只有 zh-CN 一种语言,仍然是一个少见的组合。
  3. 一次只改一样,再测一次。同时换代理又改系统时区,你就不知道是哪一个起了作用。
  4. 笔记本从睡眠中唤醒或 VPN 重连之后再测一遍,时区最容易在这些时刻移动。

检测你自己的时区结果

实验室会把浏览器报告的时区和 IP 所在时区并排比较,并在旁边显示语言与时差。

打开实验室

怎么修

一个身份、偶尔使用: 用代理期间把操作系统时区改成代理所在城市,用完改回来。改完重启浏览器,有些浏览器会在启动时缓存时区。

一个身份、长期使用: 代理固定不变,就让操作系统一直停在那个时区,语言和键盘也一并对齐。最便宜的一致,是不需要你记着去维护的一致。

多个身份: 操作系统的时钟不可能同时在三个地方。每个浏览器环境需要自己的时区、自己的语言列表和自己的代理,而且这三样要从同一个来源设置,才不会各走各的。到了这一步,通用浏览器就不够用了。

不要做的事: 不要把时区设成 UTC 来「保持中立」,也不要装一个只伪造 Intl、不管 Date 的扩展。两种做法都会造出一个内部自相矛盾的浏览器,这比一个一致地待在错误地点的浏览器更糟。

多账号运营时这意味着什么

时区是平台能做的最便宜的交叉检查,所以每个请求都会做。五个环境挂五个国家的代理,却都报告同一个家乡时区,就是五个账号戴着同一块手表。关联在它们做任何可疑动作之前就已经建立。

规则和 WebRTC 那篇一样:所有描述位置的信号必须描述同一个位置。IP、时区、时差、语言、地理位置,要么是同一个故事,要么就是证据。

Mango Browser 怎么处理时区

Mango 的每个环境都有独立的时区设置,两种模式:跟随所绑定代理的出口 IP(默认),或固定为你选择的时区。两种模式下 Date、Intl 和时差报告的都是同一个时区,并按日期应用夏令时,所以上面那两行 JavaScript 永远相互一致。

语言同理。默认跟随出口 IP(新加坡代理得到 en-SG),也可以固定一个列表;Accept-Language 请求头、navigator.languages 和 Intl 区域设置一起设定。地理位置也可以跟随出口 IP。给一个环境换代理,它的位置故事整体跟着换,不用碰操作系统的时钟。

参考资料

  1. MDN: Intl.DateTimeFormat.prototype.resolvedOptions()
  2. MDN: Date.prototype.getTimezoneOffset()
  3. IANA Time Zone Database

到指纹实验室看看你的浏览器暴露了什么

继续阅读