基于 Flask 的 RESTful API,想控制并发用户数为 1 个,但是用 Token 的话抓包拿到 Token 不就可以自己用 Token 调用 API 了吗? C/S 两端都是用 Python 的

2017-07-07 20:49:46 +08:00
 a251922581
服务器端算是个应用服务器吧,Flask 搭了 RESTful API,PyQT 客户端调用 RESTful API 完成业务操作。但是卖给用户的话是按 1 个用户授权,如果用户登录后给个 Token 做以后 API 的授权的话,抓包或浏览器调试工具里找到 API 就可以无限制调用需要 Token 的 API 了,RESTful 是无状态的,一般客户公司里都一个公网 IP 出来的,有办法识别吗?还是用其它授权方案代替 Token ?
先谢过了。。
4278 次点击
所在节点    Python
13 条回复
XYxe
2017-07-07 21:05:46 +08:00
一次请求换一个 Token
lerry
2017-07-07 21:13:11 +08:00
https 应该抓不到吧
prasanta
2017-07-07 21:19:30 +08:00
证书呀,就像银行登陆的证书
est
2017-07-07 21:55:20 +08:00
@XYxe 挺靠谱。做个状态机。
TJT
2017-07-07 22:18:55 +08:00
证书,请求签名
jinganchuqi
2017-07-07 22:21:03 +08:00
加个签名不就行了,token 参与签名。
akira
2017-07-07 22:37:16 +08:00
首先,任何可以在用户机器上运行的代码都是可破解的,不管你如何限制多人访问,总是有办法可以绕过的。

一个比较简单粗暴的方案,提交的接口参数里面,增加一个加密过的 自增字段。 然后统计自增数字有冲突的情况,基本上,就可以知道哪个账号是有多开行为了的。
ipconfiger
2017-07-07 23:02:23 +08:00
@est 试过这种方案, 不行, 网络抖动一些就隔屁了.
tomczhen
2017-07-07 23:20:27 +08:00
改成按 API 调用次数收费。:doge:

讲正经的。

使用 jwt 来解决,在 jwt 存放用户名,token 和一个随机值(比如 uuid ),服务端保存下发的 jwt,推荐 redis。

jwt 过期时间设定要小一些,比如 1 分钟,甚至 30 秒,如果网络不稳定可以适当延长有效时间。

API 发现 JWT 过期时,重新生成一个 JWT 返回即可,同样服务端要保存。

这里 jwt 和鉴权 token 可以没有关联(取决于你的业务),jwt 可以过期,但必须是有合法签名,如果业务允许,你仍然可以让他继续。

如果使用抓包的方式获取 jwt 和 token,然后多处使用,那么在这个 jwt 过期后必然会产生,一个用户有多个不同的 jwt 同时有效的情况。
DCjanus
2017-07-08 04:46:07 +08:00
使用 SSL pinning 技术增大抓包难度。
自增字段、加密网卡号等方式都可以增加破解难度。
破解难度高到一定程度即可,再费劲就得不偿失了。
devilyaos
2017-07-08 07:56:08 +08:00
所以好些软件绑死 mac...
jininij
2017-07-08 08:58:30 +08:00
如果客户知道你 API 协议的细节,就可以搭建 API 中心,所有的客户端调用接口,都不是直接调用你的服务器接口,而是调用 API 中心的接口,API 中心对数据进行签名,使用队列一个一个地请求。你在服务器端没有任何办法可以知道,真正使用你服务的是谁。

你能做的,只有尽可能让你的 API 不会被挖出来了。
vingz
2017-07-08 09:04:24 +08:00
做头部数据的 hash ? hash 不一致就无效了,https 更好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373812

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX