起因:因为图片服务器为了统计信息,所以做了 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 呢?望大神们不吝赐教~~
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 请求即可
|
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
RqPS6rhmP3Nyn3Tm 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
楼上说的是对的。
|
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
形象点说,又是一个持有工商储蓄卡就想修改工行卡余额的……
|
28
SoyaDokio OP @zbinlin 图片服务器好像是为了统计自家 APP 的相关信息,所以对 UA 做了特殊判断(是否包含特定字串),而现在就是想要对(需要用到该图片服务器的资源的) WebAdmin 后台管理页面在请求该图片服务器的资源时的请求头中的 UA 做特殊修改(追加上图片服务器需要的特定字串)。
另,请教“如果是通过浏览器的请求,一般需要使用浏览器的扩展来实现”,和“如果是通过 JS 请求的, xhr 和 fetch 都可以直接修改”分别是什么意思,难道是指前者是由浏览器发出 GET 请求的,后者是由 JS 发出请求的?还不是一回事儿? |
35
SoyaDokio OP @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 ココロ 源自一首歌 |
42
SoyaDokio OP @jimwoo 其实主要是因为后台管理页面是可以随处登陆的,用户也不会是同一个人,如果每次登陆都修改一次登录时用的浏览器的 UA ,那就有点儿...
|
43
chemzqm 2017-01-08 15:06:43 +08:00
nginx 反代设置 header , 一行搞定,如果服务端有用 nginx 的话。
图片反盗链都是检测 Referer 头部吧,第一次听说检测 UA 的 |
44
SoyaDokio OP @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 |