mysql/php请求操作

31moq8wy  于 2021-06-19  发布在  Mysql
关注(0)|答案(4)|浏览(287)

第一次发布。
我管理一个网站,处理虚拟货币的某些类型的交易。它是一个php/mysql web应用程序。最近我们让一个用户以某种方式提取了6到7次相同的金额(基本上是复制他们的虚拟货币)(直到我们用完了资金)。查看日志,这些交易是以毫秒为间隔处理的,因此我假设他们用户有5000笔资金,并通过垃圾邮件请求提取这些资金,以试图提取比他们拥有的更多的资金。
我怎样才能阻止这种情况在将来发生,我怎样才能测试这种情况,或者自己重复这个过程?
谢谢你的帮助。
我不认为这是一个典型的问题,对不起。我不是开发人员,我现在的开发人员正在休假,所以他拒绝协助。

afdcj2ne

afdcj2ne1#

一种管理方法是强制在时间戳级别传递特定的时间间隔(即用户不能在x分钟内处理多个事务)。
为此,假设您要将事务统计信息插入到表中,然后相应地应用它,您可以对新插入强制执行check约束,该约束将拒绝任何不符合时间戳条件的行

2cmtqfgy

2cmtqfgy2#

避免垃圾邮件请求的一些想法:
正面:
禁用允许用户单击并发送垃圾邮件的按钮。
当用户单击时,用一些加载图标替换按钮
背面:
在事务开始时创建临时文件(或编辑一个文件以添加有关事务的一些信息)和事务结束时删除文件(或数据)。因此,在每个事务之前,检查是否有文件/数据:if you have something->no transaction,因为有一个事务已经在运行。关于此的一些文档:http://php.net/manual/fr/function.file-put-contents.php
另一种方法是在数据库中添加一些参数(或创建一些类似于user\u事务的表),在事务开始时创建一个user\u事务行(或根据需要将参数从0更改为1),在事务结束时删除该行或将参数从1更改为0。因此,在每个事务之前,您要检查是否存在该用户的行,或者参数是否为1:if yes->no事务,因为其中一个事务已经在运行。这里没什么复杂的,我没有关于你数据库的信息,所以不能做更多:)
试着从前面加一把锁+从后面加一把锁,你应该可以减少这个问题!
编辑:添加一些跟踪
为避免用户对垃圾邮件的请求,您可以添加一些跟踪以避免欺诈:
您可以添加一些计数器,并添加+1每次用户点击,以知道他是否垃圾邮件
您可以在数据库中创建一个表,以便知道用户每次发送请求时单击哪个用户、单击时间和货币数量(例如)
这样你就知道谁欺诈(谁点击了很多垃圾邮件请求或谁发送了许多请求在几次)和你可以发送电子邮件或警告信息,例如,如果你可以跟踪他赢得的货币数额“作弊”,让他把它还给我不知道你的应用程序如何工作!

ig9co6j1

ig9co6j13#

如果余额的类型是整数或大整数,将其设为无符号将防止其变为负数。

ALTER TABLE user MODIFY balance BIGINT UNSIGNED NOT NULL;
mo49yndu

mo49yndu4#

提取资金的sql应该是:

UPDATE balance
   FROM users
   SET balance = balance - $amount
   WHERE id = $id AND balance >= $amount

如果有0行受影响,则余额不足。
任何在手之前测试平衡的解决方案都容易受到比赛条件的影响。

相关问题