V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
SoyaDokio
V2EX  ›  JavaScript

请教 JS 如何修改 UserAgent?

  •  
  •   SoyaDokio · 2017-01-07 19:31:59 +08:00 · 30340 次点击
    这是一个创建于 2877 天前的主题,其中的信息可能已经有所发展或是发生改变。

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