如何防止多个快速发布请求到PHP脚本

时间:2016-01-04 15:03:01

标签: php ajax .htaccess codeigniter security

我在codeigniter中有一个控制器,由UI从Ajax调用,在UI的正常操作中,每件事都很好,这就是脚本中发生的事情,这只是一个不真实的演示代码(只是想表明发生了什么) ):

$uid=$_POST['uid'];
$id=$_POST['id'];
$bank=load_bank($uid,$id); // Load Bank From MySql DB

add_to_user_balance($uid,$bank['amount']); // "Add" the bank's amount to user balance in DB

zero_bank_amount($uid,$id); // Reset the bank amount to zero

在2个普通的UI调用中(彼此之后称为1):

  • 在第一次通话中,$ bank [' amount']为1000(例如)。它被添加 到用户的余额并设置为0
  • 在第二次通话中,$ bank [' amount']为0,因为它在最后设置为0 呼叫,所以没有任何东西被添加到余额

但是,一些垃圾邮件发送者/黑客使用一些机器人或其他任何东西来非常快地调用这个控制器。例如,假设此脚本立即被调用2次(例如小于200ms):

  • 在第一次通话中,$ bank [' amount']为1000(例如)。它被添加 到用户的余额并设置为0
  • 在第二个电话中,$ bank ['金额'] 不是0 ,因为第一个电话仍在工作,并且没有设置$ bank ['金额为“0”,因为它在第二次通话之前没有足够的时间

你有什么方法可以防止这种快速通话吗?例如,限制用户在每次通话之间有1s的差距?

1 个答案:

答案 0 :(得分:0)

使用您选择的锁定。

一些可能性(还有更多):

  1. filesystem:在临时目录中创建一个名为lockfile_uid的文件,其中uid是唯一的用户ID。 在开始任何交易之前,请检查此文件是否存在(如果存在),不执行任何操作或创建错误。 如果它不存在,则在脚本启动时创建文件,并在完成后将其删除。

  2. 数据库:使用uid创建一个具有相同目的的表。与上述逻辑相同