代理出口在法兰克福,浏览器却报告 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 时差的浏览器,等于告诉网站自己在撒谎。
正确的检测方法
- 用你实际使用的代理打开实验室。时区一行会把浏览器报告的时区和 IP 解析出的时区并排显示。
- 顺便看语言一行。德国 IP、德国时区,浏览器却只有
zh-CN一种语言,仍然是一个少见的组合。 - 一次只改一样,再测一次。同时换代理又改系统时区,你就不知道是哪一个起了作用。
- 笔记本从睡眠中唤醒或 VPN 重连之后再测一遍,时区最容易在这些时刻移动。
检测你自己的时区结果
实验室会把浏览器报告的时区和 IP 所在时区并排比较,并在旁边显示语言与时差。
怎么修
一个身份、偶尔使用: 用代理期间把操作系统时区改成代理所在城市,用完改回来。改完重启浏览器,有些浏览器会在启动时缓存时区。
一个身份、长期使用: 代理固定不变,就让操作系统一直停在那个时区,语言和键盘也一并对齐。最便宜的一致,是不需要你记着去维护的一致。
多个身份: 操作系统的时钟不可能同时在三个地方。每个浏览器环境需要自己的时区、自己的语言列表和自己的代理,而且这三样要从同一个来源设置,才不会各走各的。到了这一步,通用浏览器就不够用了。
不要做的事: 不要把时区设成 UTC 来「保持中立」,也不要装一个只伪造 Intl、不管 Date 的扩展。两种做法都会造出一个内部自相矛盾的浏览器,这比一个一致地待在错误地点的浏览器更糟。
多账号运营时这意味着什么
时区是平台能做的最便宜的交叉检查,所以每个请求都会做。五个环境挂五个国家的代理,却都报告同一个家乡时区,就是五个账号戴着同一块手表。关联在它们做任何可疑动作之前就已经建立。
规则和 WebRTC 那篇一样:所有描述位置的信号必须描述同一个位置。IP、时区、时差、语言、地理位置,要么是同一个故事,要么就是证据。
Mango Browser 怎么处理时区
Mango 的每个环境都有独立的时区设置,两种模式:跟随所绑定代理的出口 IP(默认),或固定为你选择的时区。两种模式下 Date、Intl 和时差报告的都是同一个时区,并按日期应用夏令时,所以上面那两行 JavaScript 永远相互一致。
语言同理。默认跟随出口 IP(新加坡代理得到 en-SG),也可以固定一个列表;Accept-Language 请求头、navigator.languages 和 Intl 区域设置一起设定。地理位置也可以跟随出口 IP。给一个环境换代理,它的位置故事整体跟着换,不用碰操作系统的时钟。