使用随机生成器在 MYSQL 中创建唯一 ID - 定义数组以排除已知 ID 是否“安全”

问题描述 投票:0回答:1

我想知道请求数据库中已有的所有(唯一 ID)并将它们存储到数组中是否安全。然后取消他们随机生成过程的资格?

例如,如果我用它来存储唯一的 ID:

$six_digit_random_number = random_int(100000, 999999);

(我在 StackOverflow 上找到的。)链接到源代码

然后想象我排除数据库中已存在的每个唯一 ID:

  1. 这样做“安全”吗? (安全问题)
  2. 这会导致任何服务器问题吗? (延迟或其他问题)

这里有一些附加信息:

  • 我想设计自己的随机生成器(完成)
  • 我想在“随机生成函数”开始之前运行一个测试,以确保从一开始就不能生成这些值。为此,我选择访问数据库并运行一个查询,将所有已知的唯一 ID 存储到一个数组中。

我的代码运行良好。但是,我不知道使用它是否安全。当我将其存储到数组中时,是否存在被劫持的风险?如果人们关闭 JavaScript 和 cookie,他们是否能够访问源代码并对其进行更改?我只是不太了解服务器端是如何工作的,所以我只是想更多地了解这种方式编码的正确/错误。我不知道如何更好地提出问题。

php mysql database function security
1个回答
0
投票

它至少容易受到竞争条件的影响。

也就是说,假设两个客户端尝试同时生成一个新的随机 ID。它们都从数据库中读取当前的 ID 集,并将该集存储到应用程序空间中自己的数组中。他们可以将它们从生成的下一个随机 ID 中排除,但他们不知道彼此随机生成的 ID。在将新记录添加到数据库之前,他们都可以生成彼此相同的 ID。

这是真实发生的事情。随着数据库的填满,这种可能性也越来越大。

假设您已经在数据库中存储了从 100000 到 999998 的值。只剩下一个需要生成 (999999)。两个客户都必须使用剩余的一个 ID。

所以不,设计具有竞争条件的应用程序是不安全的。

您可能认为两个客户端同时插入记录的情况很少见。但有句老话:

下周二是百万分之一。

换句话说,你认为“永远”不会发生的罕见事件实际上会比你想象的更早发生。

© www.soinside.com 2019 - 2024. All rights reserved.