V2EX 首页   注册   登录
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 · 315 天前 · 6975 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    https://www.npmjs.com/package/request#custom-http-headers
        46
    SoyaDokio   314 天前
    @menway 这样的话,这些图片直接存在 WebAdmin 的服务器上更直接。不过也是一个思路。
        47
    jimwoo   313 天前
    @SoyaDokio 那你就检查 referer||UA 不行啊?非要单独判断 UA 吗?
        48
    lslqtz   313 天前
    @SoyaDokio 是的
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   488 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 64ms · UTC 21:13 · PVG 05:13 · LAX 13:13 · JFK 16:13
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1