请教一个问题,网站是如何识别当前浏览器是 edge 而不是 chrome 的?

96 天前
 XIoYi
如题
公司用的 OA ,绑定了 chrome 浏览器,使用其他浏览器是完全打不开的,只有 google chrome 能正常打开并使用,不然就会提示“无法访问”
我以为是 UA 头,用浏览器插件 User-Agent Change 插件修改后还是不行,所以,请教下,这个是怎么实现的?一般有哪些实现方法?
或者有没有什么文档文章什么的推荐下,我自己去看也行~
4127 次点击
所在节点    程序员
34 条回复
MRG0
96 天前
我猜测这个判断是前端写的,按照这个思路可以在浏览器搜索“前端如何判断浏览器”
typedefine
96 天前
userAgent
Mithril
96 天前
你可以搜 browser fingerprinting

除了 UA ,也可以通过测试某些功能是否支持来区分判断浏览器。但我觉得一个 OA 可能用不到这么复杂的逻辑,很可能是找了某个开源库来做的。
typedefine
96 天前
你要注意提交的包啊 , 不一定是在一个请求中确认的 用户画像能懂吗
Puteulanus
96 天前
提示无法访问是怎么提示的,网页加载出来之后页面上提示(前端判断),一个请求返回了这个错误(后端判断),或者直接后端拒绝回复了,是浏览器的错误页面?

如果是后端判断的,找到那个请求,复制为 curl 命令执行看看是否返回正常( TLS 指纹),如果正常的话用 edge 相同的请求,开始比较 HTTP 请求的 header 和 url 参数这些是不是一样

前端判断的话可以用油猴提前注入它检测用到的 JS 函数来模拟 Chrome 的行为
XIoYi
95 天前
@typedefine 有道理,我抓个包看看
XIoYi
95 天前
@MRG0
XIoYi
95 天前
@Mithril
XIoYi
95 天前
@Puteulanus 我试试
beyondstars
95 天前
有可能是利用 Edge 和 Chrome 支持的 API 的差异来判断的,例如有一个 API 在 Edge 支持但是在 Chrome 不支持,或者在 Chrome 支持但是在 Edge 不支持,多利用几个这样的 API ,(利用贝叶斯原理)计算后验概率,可以以一个比较大的准确率判断浏览器的类型。
cmsyh29
95 天前
ua
beyondstars
95 天前
下列举例使用贝叶斯方法,利用 API 可用性探测以及浏览器兼容性矩阵来计算用户当前使用特定浏览器的后验概率。

例如考虑如下的浏览器兼容性矩阵:

```
firefox chrome edge
api1 y n y
api2 y y n
```

设随机变量 X 表示用户当前使用的浏览器。

令 X=firefox, X=chrome, X=edge 的先验概率都为 1/3 。

现假设观测到 api1 可用,则可得后验概率:

Pr{api1 | X=firefox}
= Pr{X=firefox | api1 } Pr{X=firefox} / Pr {api1}
= Pr{X=firefox | api1 } Pr{X=firefox} / ( Pr{X=firefox}Pr{X=firefox|api1} + Pr{X=chrome}Pr{X=chrome|api1} + Pr{X=edge}Pr{X=edge|api1} )
= (1 * (1/3)) / ((1/3 * 1) + (1/3 * 0) + (1/3 * 1))
= 1/3 / 2/3
= 1/2

对先验概率进行更新:

Pr{X=edge} -> 1/2

同理可得,Pr{X=firefox} -> 1/2 ,Pr{X=chrome} -> 0 。

现假设在这之后又观测到了 api2 不可用,那么

Pr{^api2|X=edge}
= Pr{X=edge|^api2}Pr{X=edge} / Pr{^api2}
= Pr{X=edge|^api2}Pr{X=edge} / (Pr{X=firefox}Pr{X=firefox|^api2} + Pr{X=chrome}Pr{X=chrome|^api2} + Pr{X=edge}Pr{X=edge|^api2})
= 1 * 1/2 / ( 1/2 * 0 + 0 * 0 + 1/2 * 1 )
= 1

由此可得,先后观测到 api1, ^api2 两个事件后,X=edge 的(后验)概率变为 1 。
eoo
95 天前
@beyondstars 这 AI 回答的真好
beyondstars
95 天前
@eoo 你幼儿园老师没教好你怎么礼貌说话吗?
beyondstars
95 天前
@eoo 看了你的主页,你这 v2 用的可真好,感觉像是工作和作业都交给 v2 网友来帮你做了,您可真聪明。
billbob
95 天前
这是什么项目,还分浏览器啊,这两个浏览器是一样的啊!当然无法区分
DOLLOR
95 天前
@beyondstars
edge 用的内核跟 chrome 一样,对 web 前端(而非 Extension 开发)来说,“Edge 支持但是在 Chrome 不支持,或者在 Chrome 支持但是在 Edge 不支持” 这样的 API 存在吗?
Jinnrry
95 天前
@beyondstars #12 洋洋洒洒贴了一大堆,实则屁用没有。

1 、但凡写过前端的,都知道可以拿 api 差异判断。
2 、又不说那些 api 差异可以拿来判断,你写个贝叶斯公式搞毛啊。
3 、这里不欢迎 AI 生成的评论,无脑贴 AI 评论会被 Ban
ztc
95 天前
window.navigator.userAgent, Edge 含 /Edg, Chrome 没有
asdjgfr
95 天前
正规的浏览器都可以用 userAgent 来判断:

``` javascript
const ua = window.navigator.userAgent.toLowerCase().replace(/\s\s+/g, ' ');
const browserMatch = (/(edge)\/([\w.]+)/).exec(ua)
|| (/(edg)[/]([\w.]+)/).exec(ua)
|| (/(opr)[/]([\w.]+)/).exec(ua)
|| (/(opt)[/]([\w.]+)/).exec(ua)
|| (/(fxios)[/]([\w.]+)/).exec(ua)
|| (/(edgios)[/]([\w.]+)/).exec(ua)
|| (/(jsdom)[/]([\w.]+)/).exec(ua)
|| (/(samsungbrowser)[/]([\w.]+)/).exec(ua)
|| (/(electron)[/]([\w.]+)/).exec(ua)
|| (/(chrome)[/]([\w.]+)/).exec(ua)
|| (/(crios)[/]([\w.]+)/).exec(ua)
|| (/(opios)[/]([\w.]+)/).exec(ua)
|| (/(version)(applewebkit)[/]([\w.]+).*(safari)[/]([\w.]+)/).exec(ua)
|| (/(webkit)[/]([\w.]+).*(version)[/]([\w.]+).*(safari)[/]([\w.]+)/).exec(ua)
|| (/(applewebkit)[/]([\w.]+).*(safari)[/]([\w.]+)/).exec(ua)
|| (/(webkit)[/]([\w.]+)/).exec(ua)
|| (/(opera)(?:.*version|)[/]([\w.]+)/).exec(ua)
|| (/(msie) ([\w.]+)/).exec(ua)
|| (/(fennec)[/]([\w.]+)/).exec(ua)
|| (ua.indexOf('trident') >= 0 && (/(rv)(?::| )([\w.]+)/).exec(ua))
|| (ua.indexOf('compatible') < 0 && (/(mozilla)(?:.*? rv:([\w.]+)|)/).exec(ua))
|| [];
```

不正规的比如某数字浏览器可以通过他们私有的 api 来判断

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

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

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

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

© 2021 V2EX