由于我是Web开发的新手,我创建了一个在线预订系统,我有一个交易Id,客户可以在其中取消预订。我已经用随机字符和字母创建了事务Id,但我想创建自定义Id示例:2014-09-000010-PM但我不知道在谷歌上搜索什么教程。谢谢你的帮助。顺便说一句,这是我的随机字符和字母代码。
function createRandomPassword() {
$chars = "abcdefghijkmnopqrstuvwxyz023456789";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i <= 7) {
$num = rand() % 33;
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
$confirmation = createRandomPassword();
?>
如果您希望ID的一部分是可读的,可以使用日期函数,如另一个答案中所述。然而,正如我在评论中所说,如果攻击者能够预测(即猜测)您的交易ID,则攻击者可以执行取消或更改他人的预订等操作。您应该使用无法预测的事务ID。因此,一个基于日期的ID本身是危险的。你需要ID,或者它的一部分,是真正随机的。
srand()函数不一定能做到这一点。它的工作是生成一系列满足随机性而非不可预测性统计测试的数字。然而,PHP确实有一种生成随机数的方法,这种方法(可能)在加密方面是安全的。看看:http://php.net/manual/en/function.openssl-random-pseudo-bytes.php
您可以使用date()函数。
http://php.net/manual/en/function.date.php
根据日期设置格式,如果你想添加一个随机部分或其他内容,可以在字符串后面添加变量+="whatever";
还要确保你的身份证是安全的和不可预测的。
利用现有代码。例如,UUID是唯一的,版本1的UUID包含时间戳,节点可以用来添加随机性(或只有你才能检索的信息的哈希)。它也是非常通常重新实现的,所以你可以找到很多教程。请记住,您需要能够创建uuid,和以后能够从字符串表示中提取信息。
或者,您可以使用Rhumsaa''Uuid包(或任何类似的完整库)来完成初始化、转换Uuid的所有工作,并专注于您的代码真正需要做的事情。
use Rhumsaa'Uuid
// Uuid casts itself as a string whenever used as a string
$myTransactionId = Uuid::uuid1( $myHexNodeString, time() );
$uuidObject = Uuid::fromString( 'e886e43a-30b5-11e4-8751-7f0000014a23' );
// Creates a PHP DateTime object
// @see http://php.net/manual/en/class.datetime.php
$timestamp = $uuid->getDateTime();
// 2014-08-31T02:24:18+00:00
$myRetrievedHexNodeString = $uuid->getNodeHex()
// 7f0000014a23