有一个对外的 API 接口,目前鉴权的解决方案是分发给用户一个 key,并通过一系列的加密手段完成鉴权,请求调用成功会返回一个可以直接访问收费资源的 url
如果别人劫持了用户的一次请求,得到了通过鉴权后的 url,那么劫持者就可以在有效期内无数次使用这个 URL
求解有没有比较好的解决方案,主要的目标是 1.解决上述问题 2.平滑升级(不影响旧用户的情况下,新用户启用新鉴权)
1
Apiao OP # 抛砖引玉
目前我的一个想法是加入 IP 校验,即服务端鉴权时检验该 IP 是否为发起请求时的 IP,不是则拒绝,这个方案的优点是可以平滑升级,缺点是无法保证每次都能拿到用户的真实 IP,有误杀的风险(虽然我感觉风险挺低的。。) 问该方案是否还有其他弊端? |
2
raptor 2019-05-22 14:53:46 +08:00
不能直接在收费 URL 里鉴权?绑定 IP 当然是一个方法,还有就是限制请求次数,超过需要重新鉴权。
|
3
Takamine 2019-05-22 14:57:21 +08:00 via Android
我手机没流量了,把你手机开热点给我连一下:doge:。
|
4
hakono 2019-05-22 15:00:47 +08:00 via iPhone
收费资源 url 也鉴权嘛,如果不鉴权的话不用劫持流量,用户自己获取到了收费 url 后把 url 往网上一发,一样都是所有人都能艹你资源
|
5
lihongjie0209 2019-05-22 15:00:50 +08:00
为什么不直接在收费的 URL 做 3A?
|
6
Apiao OP @raptor 其实收费的 url 里是有鉴权的,但这些信息都已经包含在先前返回的 url 里了,如果劫持者拿到这个 url 就可以直接访问
|
7
Apiao OP @lihongjie0209 3A 具体是指?
|
8
Apiao OP @hakono 对,其实就是只要有了后面的链接谁都能访问,因为所有校验信息都包含在 url 里了,这个要再重新做鉴权该如何操作呢?让用户加新的 key 吗?
|
9
smdbh 2019-05-22 15:11:30 +08:00 via iPhone
https?
|
10
theTd 2019-05-22 15:19:26 +08:00
https
|
11
swulling 2019-05-22 15:20:48 +08:00 via iPhone
防攻击用 https 就最简单了,兼容就同时允许 HTTP 和 https
|
13
AlexaZhou 2019-05-22 15:22:29 +08:00
把通过过鉴权后的 url 关联到用户,对不同的用户返回不一样的资源 url,这样就可以计费到用户了
|
14
ihciah 2019-05-22 16:14:22 +08:00
问题场景倒是挺常见的,比如百度盘。。
client 在使用完链接后主动请求 disable 这个资源? |
15
micean 2019-05-22 16:22:43 +08:00
服务端识别不了中间人攻击吧
什么样的资源?最好是自己做客户端 |
16
hakono 2019-05-22 16:54:39 +08:00
@Apiao 做 cookie 认证啊。你的 api 总不会不需要用户登录就能直接获取下载 url 吧。
对下载 url 也做一个同样的登陆认证就行了。 |
17
jjianwen68 2019-05-22 17:04:03 +08:00 1
不同的用户应该生成不同的 url,生成的 url 有访问频率限制和有效期,这样是不是够
|
18
wisej 2019-05-22 17:14:58 +08:00 via Android
@jjianwen68 赞同,资源 url 带有已鉴权的身份信息(比如对 uuid 进行对称加密)。其他人访问的时候就可以后端解密,对 url 里的 uuid 和访问这个 url 用户 uuid 进行一个比较
|
19
danmu17 2019-05-23 01:44:48 +08:00
典型的思路不清晰,也不去读业内规范。
好奇是不是国内绝大多数的程序员都是这样的? |