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

请教 JS 如何修改 UserAgent?

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

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