关于网站检测浏览器 UA

2018-02-14 18:27:27 +08:00
 fengleidongxi

已强制开启浏览器调试,并更改了浏览器 UA 和分辨率,操作系统 UA 也更改成了桌面,为什么有少数网站仍然能检测到用的是非桌面系统,并自动跳转到 WAP、移动版网页,他是究竟是怎么检测到的?

10887 次点击
所在节点    Android
41 条回复
lany
2018-02-14 19:33:30 +08:00
分辨率?
zhuanzh
2018-02-14 19:46:50 +08:00
我之前问过
一个同学说其中一种方法是通过手机浏览器无法实现的 js 判定
fengleidongxi
2018-02-14 21:32:25 +08:00
@zhuanzh 能具体些吗?移动端和桌面内核相同,JavaScript 应该也一样啊,怎么会无法实现?
fengleidongxi
2018-02-14 21:33:08 +08:00
@lany UA 和分辨率修改了,仍然能检测到
mikii
2018-02-14 21:34:24 +08:00
能说一下少数网站都有哪个吗,想看看
gam2046
2018-02-14 21:38:30 +08:00
是不是这位大佬的锅?

window.navigator.platform

一般来说多数浏览器模拟其他平台并不会改变这个的返回值,至于原因,并不明确。
fengleidongxi
2018-02-14 21:50:17 +08:00
@mikii 具体名字我也没记,反正都是不常用的网站。但是,用浏览器自带请求桌面,是检测不到的,说明浏览器自带的不只是更改 UA 和分辨率
fengleidongxi
2018-02-14 21:54:33 +08:00
@gam2046 可以说下这个值怎么测试吗?
gam2046
2018-02-14 21:57:51 +08:00
https://i.loli.net/2018/02/14/5a843fe068ced.jpg

我这是 Chrome 开了模拟,很早以前我试过 Chrome 和 Firefox 表现结果是一样的,Firefox 许久没用过,不得而知现在是否一样。Win32/Win64 总不可能是移动设备吧?
fengleidongxi
2018-02-14 22:35:15 +08:00
@gam2046 多谢多谢,刚才我也测试了,的确是 navigator.platform 的原因,移动端检测到 Linux armv8l,而桌面检测到 win32。这个有办法改吗?
gam2046
2018-02-14 22:43:20 +08:00
如果浏览器是可控的(如应用开发者,可以直接改变该行为),如果浏览器不可控,navigator.platform 本身是只读属性,因此原则上是不能改。

但是由于 javascript 的关系,其实只要在检测代码之前运行一段代码是可以改变该属性的返回值:

Object.defineProperty(navigator,'platform',{get:function(){return 'Linux armv8l';}});

如果是桌面端浏览器,可以通过各类插件或者 userscript 来在网页 javascript 执行之前改变该值。但是同样网站也可以检测到你变更了默认行为,接下去其实是无休无止的小九九,没啥意思了。但是绝大多数网站应该并没有这种检查,因此只要在网站之前执行上面那段代码,就可以了。

https://i.loli.net/2018/02/14/5a844a822a394.jpg
fengleidongxi
2018-02-14 22:49:03 +08:00
@gam2046 桌面这办法多的是,主要是移动端,不太好办,检测这个的网站确实是少之又少
gam2046
2018-02-14 23:04:15 +08:00
@fengleidongxi 移动端,听说 Firefox 是支持插件的,你可以试试。由于我自己中 Google 毒颇深,所以没在移动端用过 Firefox。包括有一些第三方个人开发者的浏览器也是支持插件的,也可以尝试。如果这些都不行,其实就比较麻烦了,方法依然有,但实际上没有可操作性。

比如可以移动设备上开 VPN 连接本地,并安装自签证书,以进行中间人攻击,劫持 http/https 请求。

不过我并没有看到过有类似的软件,有这方面功能的都是开发工具,通常用于抓包,并没有篡改的功能。

话说回来,其实网站想知道是否为移动平台,有挺多奇技淫巧。比如桌面端的浏览器通常都不支持 HLS,而移动端支持。又比如桌面端浏览器在使用过程中不会出现触屏事件( touchstart/touchend/touchmove ),而移动端不会数显鼠标相关事件( mousedown/mousemove/mouseup )。所以这个其实是看网站方愿意花多大力气来检测,只要想,总是有一些出其不意的点能查出来。
crysislinux
2018-02-14 23:13:17 +08:00
还有个办法,移动端主流的浏览器 100vh 和 100% body.innerHeight 值是不一样的,但是桌面端是一样的
fengleidongxi
2018-02-14 23:34:51 +08:00
@gam2046 刚才我又测试了一次,移动端更改 UA、分辨率,可以检测到假桌面,并跳转移动版。但用浏览器自带的"请求桌面网站“选项,网站并没有检测到是桌面,也没有跳转移动版,顺利进入桌面版网页。这就说明浏览器自带的"请求桌面网站“选项,所更改的不只是 UA 和分辨率,还有其他,就是不知道这个其他是什么?("请求桌面网站“选项也没有改变 navigator.platform )
fengleidongxi
2018-02-14 23:39:44 +08:00
@crysislinux 看来能检测的真不少
iwtbauh
2018-02-15 00:05:16 +08:00
@fengleidongxi 看到前面就有点怀疑,现在一看果然不是 window.navigator.platform 的问题,毕竟这个返回的是 Linux armv8l,要是当作移动端了,用 arm 处理器的 Linux 用户岂不是得抗议

@gam2046 桌面浏览器也可能会产生触摸屏事件,比如带触摸屏的一体机 /带触摸屏的笔记本。之前见过,环境是 chromium,Debian GNU/Linux 8,Xorg,驱动程序是 xserver-xorg-input-libinput ( evdev 驱动下没有产生触摸屏事件)和 chrome,Windows 7 ( Tablet PC )
gam2046
2018-02-15 00:20:51 +08:00
@iwtbauh 没使用过带触控输入设备的桌面端设备。所以,这个没有发言权。

按照这么说,Chrome 会根据计算机上的驱动程序来决定 javascript runtime ?如果你那边有环境的下,试试看这段 javascript 在你说的环境下,是否会返回 true。我以为这种 runtime 的差异是在浏览器编译时期决定的,桌面端浏览器使用触控设备也会触发 mousemove 这些事件。不过,这本来就是奇技淫巧,应该在大多数场景下,还是比较具有参考性的

('ontouchstart' in document.documentElement)
nciyuan
2018-02-15 04:08:38 +08:00
@gam2046 树莓派用户已经强烈反感某大厂的网站了!
@fengleidongxi 我刚才在我的服务器上开了个 phpinfo 测试了一下,Chrome 就是改了 UA 啊,没改前是
Mozilla/5.0 (Linux; Android 7.1.1; OD105 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36
改之后是
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36
一般正确的判断是检测 UA 中的 Chrome 后是否含有 Mobile
有则跳转,无则继续
nciyuan
2018-02-15 04:22:06 +08:00
还有部分网站是指?也有可能不是用的检测,而是声明 X-UA-Compatible,是主动型的。当然还还还还还有一堆方法,比如检测 Flash,现在的浏览器全部自带,手机一个没有(Adobe Flash Player 曾经有 Android 版,但是停更了)。IE 和 Edge 也带 flash 哦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/430748

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX