V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pabupa
V2EX  ›  程序员

即时转账被黑客利用了,希望大佬来帮忙看下……

  •  
  •   pabupa · 2018-09-06 19:39:17 +08:00 · 2500 次点击
    这是一个创建于 2270 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前发现的问题是,并发没有解决好。当余额还有 1 元时,并发的请求每个拿到的余额都是 1 元,然后就各自转账成功了。

    转账的方法会先进入一个 PayLock,我觉得 PayLock 能够解决并发的问题,但是并没有。

    paylock.py

    技不如人,,,感觉很难受…………

    领导还给黑客打了电话,据说他们很嚣张,,,,有录音我也不想听。。。。承认自己是个彩笔的感觉真的是………………

    第 1 条附言  ·  2018-09-06 20:59:25 +08:00
    此帖终结,好吧…………醉了。
    tms
        1
    tms  
       2018-09-06 19:46:08 +08:00
    不是队列么?
    baojiweicn2
        2
    baojiweicn2  
       2018-09-06 19:47:56 +08:00 via iPhone
    加个 freeze 的中间态,加个全局锁,事务操作,本地注册表和最终一致性。
    p2pCoder
        3
    p2pCoder  
       2018-09-06 19:49:30 +08:00 via Android
    加个强校验
    先冻结 然后再请求银行或者第三方支付机构
    给账户加锁


    先把转账功能关了
    fancyhan
        4
    fancyhan  
       2018-09-06 19:49:31 +08:00
    典型的 Reenterence attack,得用支持事务的数据库
    oyosc
        5
    oyosc  
       2018-09-06 19:51:33 +08:00
    这种转账没有事务操作嘛...
    swulling
        6
    swulling  
       2018-09-06 19:56:22 +08:00
    并发冲突都不解决,还敢上线金融服务。。
    DeWhite
        7
    DeWhite  
       2018-09-06 20:14:10 +08:00
    A 为总值,操作金额为 B
    A≠B,触发停用账号
    人工审核完事了
    realpg
        8
    realpg  
       2018-09-06 20:15:53 +08:00
    连基本的事务都不会用就敢写涉及钱的东西 大写的服
    statfall
        9
    statfall  
       2018-09-06 20:19:36 +08:00 via Android
    没有用阿里微信第三方支付?
    gamexg
        10
    gamexg  
       2018-09-06 20:19:37 +08:00
    没测试人员?
    Sor
        11
    Sor  
       2018-09-06 20:24:40 +08:00
    楼上的给点解决办法呀 这种类似的问题以前我也遇到过,按理说用 redis 应该可以解决吧
    mhtt
        12
    mhtt  
       2018-09-06 20:44:10 +08:00
    你们在做二清?
    pagxir
        13
    pagxir  
       2018-09-06 20:53:27 +08:00
    上区块链,等交易被写入区块并且被确认之后在发送交易,写入失败则拒绝发送交易。
    blless
        14
    blless  
       2018-09-06 20:57:07 +08:00 via Android
    @Sor redis 呗 账号操作前先申请一个分布式锁,用账号名做 key 不就好了 整个流程完成再解锁
    Sor
        15
    Sor  
       2018-09-06 21:07:14 +08:00
    @blless 嘿嘿嘿 我也这样想的
    moult
        16
    moult  
       2018-09-06 21:23:38 +08:00
    转账请求提交到第三方支付之前,先从账户里面扣款并更新余额字段,更新余额字段一定要 update set money=money-x,让数据库去减,切忌不要在程序中减好再去更新。更新成功之后,再去实时查询出当前余额,看看余额是否小于 0。
    毕竟同时对数据库对同一条记录的 update 肯定是先后被执行的。
    fancyhan
        17
    fancyhan  
       2018-09-07 03:23:07 +08:00
    问题在这里
    ```
    def __exit__(self, exc_type, exc_val, exc_tb):
    self.clear()
    ```
    异常也会删除键值,我们利用一次异常就能清除状态了,然后再攻击即可
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1060 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:23 · PVG 03:23 · LAX 11:23 · JFK 14:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.