【问题标题】:Can the Javascript `userAgent` differ from a browser's header requestJavascript `userAgent` 能否与浏览器的标头请求不同
【发布时间】:2017-08-30 12:05:21
【问题描述】:

是否存在任何合理的情况,其中 Javascript 报告的 navigator userAgent 可能与作为 User-Agent 标头发送的不同。

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

navigator.userAgent 是“只读”使得更改不太可能。我只是想知道黑客或扩展程序是否真的可以在普通浏览器或无头浏览器上这样做,无论出于何种原因。

【问题讨论】:

    标签: javascript browser http-headers user-agent navigator


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      好的,这是我自己的测试和研究的答案。在野外,标头和客户端之间存在三种类型的用户代理差异:

      IE 发送pre and post platform registry value tokens to the server to improves compatibility and network performance 的短UA 字符串策略。使用通过navigator.userAgent 提供的扩展UA 字符串。然后他们添加了添加 extension tokens 的功能。


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

      然而,Javascript 报告了一个通用的 Safari Mobile 网络视图用户代理。


      UCMini (U2) 向 UCWeb 用户代理发送请求,例如:

      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

      当客户端报告这个 wackadoodle 时:

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

      【讨论】:

        【解决方案3】:

        是的,在不完整的用户代理欺骗的情况下。

        这样的浏览器插件

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

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

        对于 [更多] 完整的用户代理欺骗,还要更改 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)'
        });
        

        测试页面:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-11
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多