我想知道请求数据库中已有的所有(唯一 ID)并将它们存储到数组中是否安全。然后取消他们随机生成过程的资格?
例如,如果我用它来存储唯一的 ID:
$six_digit_random_number = random_int(100000, 999999);
(我在 StackOverflow 上找到的。)链接到源代码
然后想象我排除数据库中已存在的每个唯一 ID:
这里有一些附加信息:
我的代码运行良好。但是,我不知道使用它是否安全。当我将其存储到数组中时,是否存在被劫持的风险?如果人们关闭 JavaScript 和 cookie,他们是否能够访问源代码并对其进行更改?我只是不太了解服务器端是如何工作的,所以我只是想更多地了解这种方式编码的正确/错误。我不知道如何更好地提出问题。
它至少容易受到竞争条件的影响。
也就是说,假设两个客户端尝试同时生成一个新的随机 ID。它们都从数据库中读取当前的 ID 集,并将该集存储到应用程序空间中自己的数组中。他们可以将它们从生成的下一个随机 ID 中排除,但他们不知道彼此随机生成的 ID。在将新记录添加到数据库之前,他们都可以生成彼此相同的 ID。
这是真实发生的事情。随着数据库的填满,这种可能性也越来越大。
假设您已经在数据库中存储了从 100000 到 999998 的值。只剩下一个需要生成 (999999)。两个客户都必须使用剩余的一个 ID。
所以不,设计具有竞争条件的应用程序是不安全的。
您可能认为两个客户端同时插入记录的情况很少见。但有句老话:
下周二是百万分之一。
换句话说,你认为“永远”不会发生的罕见事件实际上会比你想象的更早发生。