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

请教 JS 如何修改 UserAgent?

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

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