我的站内有一些类似用户和用户之间转账的功能,如何保证这个功能的安全
如题我的站内有一些类似用户和用户之间转账的功能,如何保证这个功能的安全,请问:我这个功能算API吗? 看了很多API安全方面的文章,那么我这个转账功能是否安全,我看有些文章说什么要加上密钥,进行加密。 但我这个功能好像又不算api吧? 属于站内功能,附上该转账功能的代码,求指点
前端就是一个正常的form表单,已经带上了csrf
public function user_transfer(Request $request){
$request->validate([
'amount' => 'required|numeric|min:1',
'phone' => 'required|numeric|exists:users,phone',
]);
//判断用户余额是否大于等于转账金额
if(Auth::user()->money >= $request->amount){
$user = Auth::user();
//扣除用户余额
$user->decrement('money',$request->amount);
$mod = new User();
$mod = $mod->where('phone',$request->phone)->first();
//给转账对象增加余额
$mod->increment('money',$request->amount);
session()->flash('success','转账成功');
return redirect()->back()->withInput();
}else{
session()->flash('fail','余额不足');
return redirect()->back()->withInput();
}
}
高认可度评论:
从代码上来看,你这不是前后端分离的项目,前后端分离项目是不会有
CSRF-TOKEN
的,这里不需要考虑安全性问题,CSRF-TOKEN
已经够安全了,你这个转账代码,最大的问题就是:同时两个不同 SESSION 的窗口登录同一个账号,可能会发生扣款一次,转账两次的情况。
综合楼上几位所说的,一共三点:
开启事务
添加并发锁
添加转账记录
代码使用了 乐观锁
扣除用户余额时,增加判断,当前的用于余额是否足够支付扣除这次转账,避免其他业务更新用户余额,比如管理后台手动扣除用户余额,造成余额不足的情况。
差不多了,我没测试,逻辑上是这样的,你可以自己再改改。
最最最起码加个事务吧 :speak_no_evil:
你这个随便来个并发就能把你打爆,最基本的也一定要加where,加事务吧,扣前实时校验,后面还有频次限制,最大值限制,还有其它很多的
🌚 请问下网站地址多少
同意楼上两个老哥说的,赶紧加个事务,涉及到钱的操作一定要确保安全,还要加个操作日志!再进一步的话就考虑并发和次数限制,想象一下假如遇到很多人同时付款,那真的就乱套了,还有由于网络原因一直重复提交支付申请,这个问题也要注意!
从代码上来看,你这不是前后端分离的项目,前后端分离项目是不会有
CSRF-TOKEN
的,这里不需要考虑安全性问题,CSRF-TOKEN
已经够安全了,你这个转账代码,最大的问题就是:同时两个不同 SESSION 的窗口登录同一个账号,可能会发生扣款一次,转账两次的情况。
综合楼上几位所说的,一共三点:
开启事务
添加并发锁
添加转账记录
代码使用了 乐观锁
扣除用户余额时,增加判断,当前的用于余额是否足够支付扣除这次转账,避免其他业务更新用户余额,比如管理后台手动扣除用户余额,造成余额不足的情况。
差不多了,我没测试,逻辑上是这样的,你可以自己再改改。