目前发现的问题是,并发没有解决好。当余额还有 1 元时,并发的请求每个拿到的余额都是 1 元,然后就各自转账成功了。
转账的方法会先进入一个 PayLock,我觉得 PayLock 能够解决并发的问题,但是并没有。
技不如人,,,感觉很难受…………
领导还给黑客打了电话,据说他们很嚣张,,,,有录音我也不想听。。。。承认自己是个彩笔的感觉真的是………………
1
tms 2018-09-06 19:46:08 +08:00
不是队列么?
|
2
baojiweicn2 2018-09-06 19:47:56 +08:00 via iPhone
加个 freeze 的中间态,加个全局锁,事务操作,本地注册表和最终一致性。
|
3
p2pCoder 2018-09-06 19:49:30 +08:00 via Android
加个强校验
先冻结 然后再请求银行或者第三方支付机构 给账户加锁 先把转账功能关了 |
4
fancyhan 2018-09-06 19:49:31 +08:00
典型的 Reenterence attack,得用支持事务的数据库
|
5
oyosc 2018-09-06 19:51:33 +08:00
这种转账没有事务操作嘛...
|
6
swulling 2018-09-06 19:56:22 +08:00
并发冲突都不解决,还敢上线金融服务。。
|
7
DeWhite 2018-09-06 20:14:10 +08:00
A 为总值,操作金额为 B
A≠B,触发停用账号 人工审核完事了 |
8
realpg 2018-09-06 20:15:53 +08:00
连基本的事务都不会用就敢写涉及钱的东西 大写的服
|
9
statfall 2018-09-06 20:19:36 +08:00 via Android
没有用阿里微信第三方支付?
|
10
gamexg 2018-09-06 20:19:37 +08:00
没测试人员?
|
11
Sor 2018-09-06 20:24:40 +08:00
楼上的给点解决办法呀 这种类似的问题以前我也遇到过,按理说用 redis 应该可以解决吧
|
12
mhtt 2018-09-06 20:44:10 +08:00
你们在做二清?
|
13
pagxir 2018-09-06 20:53:27 +08:00
上区块链,等交易被写入区块并且被确认之后在发送交易,写入失败则拒绝发送交易。
|
14
blless 2018-09-06 20:57:07 +08:00 via Android
@Sor redis 呗 账号操作前先申请一个分布式锁,用账号名做 key 不就好了 整个流程完成再解锁
|
16
moult 2018-09-06 21:23:38 +08:00
转账请求提交到第三方支付之前,先从账户里面扣款并更新余额字段,更新余额字段一定要 update set money=money-x,让数据库去减,切忌不要在程序中减好再去更新。更新成功之后,再去实时查询出当前余额,看看余额是否小于 0。
毕竟同时对数据库对同一条记录的 update 肯定是先后被执行的。 |
17
fancyhan 2018-09-07 03:23:07 +08:00
问题在这里
``` def __exit__(self, exc_type, exc_val, exc_tb): self.clear() ``` 异常也会删除键值,我们利用一次异常就能清除状态了,然后再攻击即可 |