推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
SoyaDokio

请教 JS 如何修改 UserAgent?

  •  
  •   SoyaDokio · Jan 7, 2017 · 31454 views
    This topic created in 3431 days ago, the information mentioned may be changed or developed.

    起因:因为图片服务器为了统计信息,所以做了 UA 验证,而 WebAdmin 的一些图片是存储在该图片服务器上的,于是 403 了。

    思路:现在我想到的最直观的思路就是使用 JS 更改登陆 WebAdmin 的浏览器的 UA 以完成验证并顺利取到图片资源。

    尝试:今天搜索了一整天,把 google 上能搜到的都看了,其中一半都在 StackOverflow 上,但是得出的解决方案就一种,且无效果,下面是“解决方案”:

    Object.navigator.\_\_defineGetter\_\_('userAgent', '自定义 UA 字串');//旧写法
    
    Object.prototype.setProperty(navigator, 'userAgent': function() {return '自定义 UA 字串';});//新写法
    

    写法大概是这样,我不太记得了,还有个写法差不多的方式就不列出来了。

    这些方案无一例外,在 JS 中修改成功,然后执行

    console.log(window.navigator.userAgent);
    

    也是正常的,但是发送到服务器的 UA 却还是未修改过的原 UA ,但是使用 Chrome 、 Firefox 自带的改 UA 的方法,均有效。所以我最后猜测: 浏览器发送给服务器请求中的 UA 和通过 JS 取到的 UA 是两个不同的实例

    那么问题来了:如何通过 JS 修改 UA 呢?望大神们不吝赐教~~

    48 replies    2017-01-09 17:31:54 +08:00
    shiny
        1
    shiny  
    PRO
       Jan 7, 2017
    js 还能改 User Agent ?
    jimwoo
        2
    jimwoo  
       Jan 7, 2017 via iPhone
    呃…你 js 修改只是改了当前页面下的环境。然而你执行完 js 后,浏览器发起请求你的图片浏览器还是会保持他本身的 ua …简单来说… js 改的只会在 js 获取的时候被改,其他地方然并卵
    zmj1316
        3
    zmj1316  
       Jan 7, 2017
    自己实现一下 http request 就可以构造自定义头了吧?
    xfspace
        4
    xfspace  
       Jan 7, 2017 via Android
    我听过用 Browser 改 UA...
    JavaScript 还能控制 UA...
    jessynt
        5
    jessynt  
       Jan 7, 2017
    NO WAY!
    smallpath
        6
    smallpath  
       Jan 7, 2017
    浏览器发的没办法, fetch 或者 XHR 可以拦截
    zbinlin
        7
    zbinlin  
       Jan 7, 2017
    > 浏览器发送给服务器请求中的 UA 和通过 JS 取到的 UA 是两个不同的实例

    http 的 User-Agent 头确实可以与 JS 的 `navigator.userAgent` 不同,比如 Firefox 就可以修改成这样,但一般是一样的。
    而你现在修改的 JS 环境里的 navigator.userAgent ,这是 JS 环境里的一个值,与 http 请求头 User-Agent 不是一个东西来的。要修改 http 请求头,如果是通过浏览器的请求,一般需要使用浏览器的扩展来实现;如果是通过 JS 请求的, xhr 和 fetch 都可以直接修改(但也不是通过 navigator.userAgent 来修改的, navigator.userAgent 是给 js 来用的)

    最后提供一个比较 hack 的做法:可以通过 xhr 或 fetch 来请求图片数据,然后转成 base64 显示出来(不过这可能会涉及到跨域问题)。

    PS :你的图片服务器不是公开的吗?为什么会屏蔽浏览器的 UA ?
    qiqiboy
        8
    qiqiboy  
       Jan 7, 2017 via iPhone
    无法,搞代理吧
    Kokororin
        9
    Kokororin  
       Jan 7, 2017 via iPhone
    ajax 请求即可
    SoyaDokio
        10
    SoyaDokio  
    OP
       Jan 7, 2017
    @jimwoo 果然是这样,那请问有无思路提供?
    SoyaDokio
        11
    SoyaDokio  
    OP
       Jan 7, 2017
    @zmj1316 HTML 静态无法实现, JS 如何实现 HTTP Request 的构造? JS 新人~~
    orvice
        12
    orvice  
       Jan 7, 2017
    ua 是浏览器加的吧
    binux
        13
    binux  
       Jan 8, 2017   ❤️ 1
    除非你找到了浏览器的漏洞, user-context 的 JS 不可能修改 user-agent
    @Kokororin ajax 也不可以修改 user-agent
    fzhw88
        14
    fzhw88  
       Jan 8, 2017 via Android
    js 的执行环境仅仅是当前页面, so …
    fzhw88
        15
    fzhw88  
       Jan 8, 2017 via Android
    @SoyaDokio 查用 Ajax 能不能构造请求头, xmlhttprequest 的实例,我忘了具体怎么搞……应该是可以的
    lslqtz
        16
    lslqtz  
       Jan 8, 2017
    你可以通过扩展方式对相应的请求截获并修改 UA 。
    wohenyingyu02
        17
    wohenyingyu02  
       Jan 8, 2017 via iPhone
    UA 的意义不就是获取客户端类型么,如果网页能随便改似乎没意义了?
    ihciah
        18
    ihciah  
       Jan 8, 2017 via iPad
    或者你可以试试 flash ……
    RqPS6rhmP3Nyn3Tm
        19
    RqPS6rhmP3Nyn3Tm  
       Jan 8, 2017 via iPhone
    用 requests 模块多好,不折腾
    skydiver
        20
    skydiver  
       Jan 8, 2017 via Android   ❤️ 1
    明显是 XY 问题…你应该从根本上解决这个问题,而不是非要用这种投机取巧的办法
    ine181x
        21
    ine181x  
       Jan 8, 2017 via iPhone
    楼上说的是对的。
    zmj1316
        22
    zmj1316  
       Jan 8, 2017
    @SoyaDokio 我没有什么前段经验,但是如果能够用 socket 的话怎么样都行啊
    zhidian
        23
    zhidian  
       Jan 8, 2017
    这样的浏览器插件应该随手可以搜到吧(如果你是在浏览器里运行 js ),比如: https://addons.mozilla.org/en-US/firefox/addon/custom-user-agent-string/ (火狐), Chrome 我猜也有。亲测有效。
    xjp
        24
    xjp  
       Jan 8, 2017 via iPhone
    不能改 head 里有几个关键字段 js 无权限修改的 比如 date 浏览器会报错 如果你是 nodejs 的话另当别论
    zhidian
        25
    zhidian  
       Jan 8, 2017
    额……又看了一遍,你已经试过了插件……
    realpg
        26
    realpg  
    PRO
       Jan 8, 2017
    形象点说,又是一个持有工商储蓄卡就想修改工行卡余额的……
    SoyaDokio
        27
    SoyaDokio  
    OP
       Jan 8, 2017
    @smallpath 多谢告知。
    SoyaDokio
        28
    SoyaDokio  
    OP
       Jan 8, 2017
    @zbinlin 图片服务器好像是为了统计自家 APP 的相关信息,所以对 UA 做了特殊判断(是否包含特定字串),而现在就是想要对(需要用到该图片服务器的资源的) WebAdmin 后台管理页面在请求该图片服务器的资源时的请求头中的 UA 做特殊修改(追加上图片服务器需要的特定字串)。
    另,请教“如果是通过浏览器的请求,一般需要使用浏览器的扩展来实现”,和“如果是通过 JS 请求的, xhr 和 fetch 都可以直接修改”分别是什么意思,难道是指前者是由浏览器发出 GET 请求的,后者是由 JS 发出请求的?还不是一回事儿?
    SoyaDokio
        29
    SoyaDokio  
    OP
       Jan 8, 2017
    @Kokororin 愿闻其详。
    另,「こころ」は何ですか?
    SoyaDokio
        30
    SoyaDokio  
    OP
       Jan 8, 2017
    @fzhw88 多谢,我搜索一下
    SoyaDokio
        31
    SoyaDokio  
    OP
       Jan 8, 2017
    @lslqtz browser extension ?
    SoyaDokio
        32
    SoyaDokio  
    OP
       Jan 8, 2017
    @ihciah Flash 一窍不通。愿闻其详。
    SoyaDokio
        33
    SoyaDokio  
    OP
       Jan 8, 2017
    @skydiver XY 问题?
    SoyaDokio
        34
    SoyaDokio  
    OP
       Jan 8, 2017
    @realpg 茅塞顿开 QAQ
    SoyaDokio
        35
    SoyaDokio  
    OP
       Jan 8, 2017
    @zhidian 其实主要是因为后台管理页面是可以随处登陆的,用户也不会是同一个人,如果每次登陆都修改一次登录时用的浏览器的 UA ,那就有点儿...
    superliang
        36
    superliang  
       Jan 8, 2017
    js 运行是浏览器解析吧,这时候浏览器已经获取请求头了呀还咋改
    BOYPT
        37
    BOYPT  
       Jan 8, 2017
    让你的 js 在浏览器插件方式运行就可以改了, 具体参考浏览器插件的 api
    Kokororin
        38
    Kokororin  
       Jan 8, 2017
    @SoyaDokio 测试了一下,确实改不了,会报错: Refused to set unsafe header "User-Agent"
    PS ココロ 源自一首歌
    SoyaDokio
        39
    SoyaDokio  
    OP
       Jan 8, 2017
    @Kokororin 多谢。
    SoyaDokio
        40
    SoyaDokio  
    OP
       Jan 8, 2017
    @BOYPT 好 我搜一下。
    jimwoo
        41
    jimwoo  
       Jan 8, 2017 via iPhone
    @SoyaDokio 代理、 chrome 的开发模式中可以改 ua
    SoyaDokio
        42
    SoyaDokio  
    OP
       Jan 8, 2017
    @jimwoo 其实主要是因为后台管理页面是可以随处登陆的,用户也不会是同一个人,如果每次登陆都修改一次登录时用的浏览器的 UA ,那就有点儿...
    chemzqm
        43
    chemzqm  
       Jan 8, 2017
    nginx 反代设置 header , 一行搞定,如果服务端有用 nginx 的话。
    图片反盗链都是检测 Referer 头部吧,第一次听说检测 UA 的
    SoyaDokio
        44
    SoyaDokio  
    OP
       Jan 8, 2017
    @chemzqm 其实我并不确定检测 UA 的目的是什么,所以猜测是为了统计自家 APP 使用情况。服务器确实是用的 Nginx ,问题是服务器我肯定动不了,不然我直接关闭验证多省事儿。不过还是感谢出谋划策了。
    menway
        45
    menway  
       Jan 8, 2017
    用 node 写可以吧?然后给前端做代理,比如本来需要访问 server1.com/1.jpg ,现在改成 server2.com/1.jpg ,在 server2 后端 pipe 一下请求到 server1 ,在请求里面设置 UA

    https://www.npmjs.com/package/request#custom-http-headers
    SoyaDokio
        46
    SoyaDokio  
    OP
       Jan 8, 2017
    @menway 这样的话,这些图片直接存在 WebAdmin 的服务器上更直接。不过也是一个思路。
    jimwoo
        47
    jimwoo  
       Jan 9, 2017
    @SoyaDokio 那你就检查 referer||UA 不行啊?非要单独判断 UA 吗?
    lslqtz
        48
    lslqtz  
       Jan 9, 2017
    @SoyaDokio 是的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2474 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 888ms · UTC 16:01 · PVG 00:01 · LAX 09:01 · JFK 12:01
    ♥ Do have faith in what you're doing.