你好这个伟大的社区,
我已经编写了以下代码行。
mysql_query("DELETE FROM token_db WHERE date < ".strtotime('-1 day'));
$token = mt_rand(1000, 9999);
$result = mysql_query("SELECT token FROM token_db WHERE token = $token");
while (mysql_num_rows($result) == 1)
{
$token = mt_rand(1000, 9999);
$result = mysql_query("SELECT token FROM token_db WHERE token = $token");
}
mysql_query("INSERT INTO token_db (date,token) VALUES('$date','$token')");这个脚本生成最大存在的令牌。24小时在数据库里。如果所有令牌(例如4位数字)都在使用中,我如何添加将令牌扩展为一位数(例如5位数字)的可能性?谢谢!
发布于 2014-02-04 10:04:15
您需要对令牌db执行计数,并对令牌条目进行计数。
mysql_query("SELECT count(token) FROM token_db");如果它们达到了一个预先定义的极限,比如9000或您的9999,那么只需
$token = mt_rand(10000, 99999); 但是,如果您确实期望更大的数目来避免处理对您的情况或多或少常见的情况,我建议增加您的令牌大小。
您典型的用例是什么?你已经想要更大的尺寸了吗?
不管怎么说,你的熵很小。有了完整的数据库(比如9000条条目),您将很难找到有效的令牌。应用程序将挂起,用户将不得不在脚本锤击数据库时等待。
如果您期望有许多令牌,您可以考虑使用没有日期的令牌预填充数据库。然后,您可以检索未设置日期的随机标记集(限制为1或10),并使用此方法。
您试图通过这种方法来实现可伸缩性,但我怀疑它是否工作得那么好,除非您在DB仍然有50%的“空间”时增加令牌数字大小。
编辑:另一个值得注意的问题是:您是否通过这样的令牌系统来保护任何重要资源?您已经选择了一个非常小的令牌,已经讨论了令牌冲突,但是忽略了的是用户猜测令牌的能力。如果您以这种方式保护敏感信息,并且从url读取令牌(例如,您通过邮件将生成的令牌发送给用户,等等),则恶意用户可能通过猜测令牌来模拟另一个令牌。如果您的四位数字令牌用完了,这很可能发生。这就是uniqid和其他大熵算法开始的地方。
发布于 2014-02-04 10:04:41
我猜是这样的:
$result = mysql_query("SELECT count(id) as numRows FROM token_db"); // credit for the edit to Samuel
$fetch = mysql_fetch_assoc($result);
$foundRows = $fetch['numRows'];
$token = $foundRows===(9999-1000) ? mt_rand(10000, 99999) : mt_rand(1000, 9999); 我添加了大括号来说明正在发生的事情,并使用99999-1000向您展示了我是如何得到数字的(mt_rand的最大-分钟)。如果将其设置为列id,因为它们通常是索引、整数和fast :)
你在这之前做过测试。
和通常的方法:开始使用mysql*i* 函数
一个更好、更持久的解决方案是uniqid()。
$token = uniqid();这将永远是一个独特的id (惊喜)。不需要进行可能会变得复杂的检查,也不需要最大标记(至少在很长一段时间内不会),
https://stackoverflow.com/questions/21549180
复制相似问题