【问题标题】:How to prvent multiple and fast post request to a php script如何防止对 php 脚本的多次快速发布请求
【发布时间】:2016-01-04 15:03:00
【问题描述】:

我在 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 次(例如少于 200 毫秒):

  • 在第一次调用中,$bank['amount'] 是 1000(例如)。它被添加 到用户的余额并设置为0
  • 在第二次调用中 $bank['amount'] is not 0 因为第一次调用仍然有效并且没有将 $bank['amount'] 设置为 0,因为它没有在第二次通话之前有足够的时间

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

【问题讨论】:

  • 这就是数据库事务的用途...

标签: php ajax .htaccess codeigniter security


【解决方案1】:

使用您选择的一些锁定。

几种可能性(还有更多):

  1. 文件系统:在临时目录中创建一些文件,其名称类似于 lockfile_uid,其中 uid 是唯一的用户 ID。 在开始任何事务之前,请检查此文件是否存在,如果存在,则不要执行任何操作,否则会产生错误。 如果它不存在,则在脚本开始时创建该文件,并在完成时将其删除。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多