Javascript `userAgent` 是否可以不同于浏览器的 header 请求

Can the Javascript `userAgent` differ from a browser's header request

是否存在 Javascript 报告的 navigator userAgent 可能与 User-Agent Header 发送的不同的合理情况。

我问的部分原因是:我有一个从 JS 收集用户代理以向服务器报告的应用程序。在大多数合法情况下没有必要。然而,他们真的会有所不同或说谎吗?

navigator.userAgent 为 'read only' 使得更改不太可能。我只是想知道黑客或扩展是否真的可以出于任何原因在普通浏览器或无头浏览器上这样做。

是的。一堆 IE 版本至少只在 javascript 中报告了插件。 https://blogs.msdn.microsoft.com/ieinternals/2009/10/07/the-user-agent-string-use-and-abuse/

好的,这是我自己的测试和研究得出的答案。 header 和 client side 在野外存在三种类型的用户代理差异:

IE 发送 pre and post platform registry value tokens to the server to improves compatibility and network performance. With the extended UA string provided through navigator.userAgent. They then added the ability to add extension tokens.

的短 UA 字符串策略

iOS 的 Tor 浏览器默认发送 Windows 桌面 Firefox 用户代理。 目前:Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0

Javascript 但是报告了一个通用的 Safari Mobile web 视图用户代理。


UCMini (U2) 发送一个 UCWeb User Agent 请求如下:

UCWEB/2.0 (iPad; U; CPU OS 7_1 like Mac OS X; en; iPad3,6) U2/1.0.0 UCBrowser/9.3.1.344

当客户端报告此怪诞行为时:

Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/

是的,以防不完整的用户代理欺骗。

这样的浏览器插件

只会更改 http-header 中的用户代理,但不会更改 javascript 变量中的用户代理

  • navigator.userAgent
  • navigator.appCodeName
  • navigator.appName
  • navigator.appVersion
  • navigator.platform
  • navigator.vendor
  • navigator.vendor亚

对于 [更多] 完整的用户代理欺骗,还要更改 javascript 变量:

// ==UserScript==
// @name        Change navigator.userAgent
// @namespace   Rob W
// @description Changes navigator.userAgent to IE on IEGallery.com
// @match       http://www.iegallery.com/*
// @run-at      document-start
// @grant       none
// @version     1
// ==/UserScript==

Object.defineProperty(navigator, 'userAgent', {
    value: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'
});

测试页: