有没有办法从后台脚本获取浏览器信息,包括版本号?

问题描述 投票:0回答:1

我想从后台脚本获取有关浏览器的当前平台信息。

Firefox 有一个

runtime.getBrowserInfo
函数,可以指定一个键
version

除了必须导入包或正则表达式用户代理字符串之外,是否有类似的优雅方法来利用 chrome 扩展 API?

google-chrome-extension browser-detection
1个回答
0
投票

简短回答

使用

navigator.vendor
而不是
navigator.userAgent
。不是很好,但这是最好的选择。 UA 不可靠并且经常变化。在供应商中寻找:

  • Chrome 浏览器中的“Google”
  • Safari 浏览器中的“Apple”
  • Firefox 中的“”(空)
  • 不确定 IE / Edge,请确认其他值

供应商已被弃用,但它仍然存在,这是一个更好的解决方案。一旦您了解了浏览器,您可以尝试从 navigator.userAgent 中挑选适当的版本号(版本信息在其他任何地方都不存在)。请注意,如果 UA 被更改(由用户、供应商或其他任何人更改),版本可能会出现严重错误。

确保您确实需要浏览器检测而不是功能检测。

长答案

解析 UserAgent 字符串(即 navigator.userAgent)是一种糟糕的方法。用户代理(UA)是建立在谎言之上的。看看这个默认的chrome UA:

    Mozilla/5.0 (Macintosh; Intel Mac OS X 31_32_33) AppleWebKit/456.78 (KHTML, like Gecko) Chrome/196.0.0.0 Safari/456.78

Chrome 立即开始模仿 Mozilla、WebKit、KHTML 和 Safari。为什么是 Mozilla?这可以追溯到网络诞生之初(90 年代初),当时 Netscape Navigator 称霸。 Netscape 的内部名称是 Mozilla。此后的每个浏览器都在模仿 Netscape Navigator,该浏览器已经消亡 20 多年了。事情还在继续:chrome 还模仿 Apple Safari 和 KHTML。将来无疑会添加其他内容。

情况变得更糟

但情况比这更糟糕。除了模拟其他浏览器之外,UserAgent 字符串是完全可以更改的。用户可以将 UA 字符串设置为他们想要的任何内容。这样做通常是为了安全(向网络服务器隐藏平台详细信息)、隐私(防止窥探)或避免管理不善的服务器限制(向不同的 UA 显示不同的内容)。 UA 甚至可以在同一个浏览器中因站点而异,通过在每个站点上设置 UA 的扩展。

解析 UA 是一场灾难。它只在基本未修改的情况下起作用 - 直到事情发生变化并且一切都崩溃了。浏览器制造商一直在更新他们的 UA 字符串,但不能保证一致性。错误地识别浏览器可能会导致难以诊断的奇怪错误。

您可能会说“那又怎样?我正在编写一个扩展。另一个扩展是否更改某些站点的 UA 并不重要。我的后台脚本看到了真正的 UA”。你就错了。

  1. 用户可以并且确实在其个人资料中设置用户代理字符串。这些在加载任何扩展之前会在浏览器范围内生效
  2. 您的扩展内容脚本可能看不到真正的UA。背景脚本和内容脚本之间的这种不匹配会给您的扩展带来麻烦。勤奋可以应付,但处理起来很痛苦。

最好的方法

目前,诊断浏览器的最佳方法是使用

navigator.vendor
。为什么?

  1. 供应商不是 HTTP 请求中发送的标头的一部分。这意味着...
  2. 供应商不太可能被网站检查(只能在客户端使用脚本完成),这意味着......
  3. 用户更改供应商字符串的动力要少得多,并且他们这样做的方式也有限

Firefox 不设置供应商。 Chrome 将其设置为“Google Inc.” Safari 将其设置为“Apple Computer, Inc.”。值可能会略有变化,但检查“Apple”或“Google”的子字符串匹配或空是安全的。

不确定 Edge / IE 与供应商做什么。也许有人可以在评论中发布。

您可以在控制台中看到导航器中的所有字符串:

for (p in navigator) { value = navigator [p];  if (typeof value == 'string') { console.log ('' + p + ' = ' + value); } }

© www.soinside.com 2019 - 2024. All rights reserved.