V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
a251922581
V2EX  ›  Python

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

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

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

    讲正经的。

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

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

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

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

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

    你能做的,只有尽可能让你的 API 不会被挖出来了。
    vingz
        13
    vingz  
       2017-07-08 09:04:24 +08:00 via Android
    做头部数据的 hash ? hash 不一致就无效了,https 更好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:04 · PVG 08:04 · LAX 16:04 · JFK 19:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.