• 请不要在回答技术问题时复制粘贴 AI 生成的内容
pabupa
V2EX  ›  程序员

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

  •  
  •   pabupa · Sep 6, 2018 · 2989 views
    This topic created in 2876 days ago, the information mentioned may be changed or developed.

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

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

    paylock.py

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

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

    Supplement 1  ·  Sep 6, 2018
    此帖终结,好吧…………醉了。
    tms
        1
    tms  
       Sep 6, 2018
    不是队列么?
    baojiweicn2
        2
    baojiweicn2  
       Sep 6, 2018 via iPhone
    加个 freeze 的中间态,加个全局锁,事务操作,本地注册表和最终一致性。
    p2pCoder
        3
    p2pCoder  
       Sep 6, 2018 via Android
    加个强校验
    先冻结 然后再请求银行或者第三方支付机构
    给账户加锁


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