Php 使用unix时间戳作为订单ID有哪些缺点?

Php 使用unix时间戳作为订单ID有哪些缺点?,php,mysql,unix,timestamp,Php,Mysql,Unix,Timestamp,我正在设计一个购物项目,并考虑使用unix时间戳作为订单ID。我知道我可以使用mySQL增量数字作为订单ID,如10001、10002等。但我不想让每个人都知道实际有多少订单 这样做安全吗?很明显,我不希望每秒超过1个订单,所以我应该是安全的,对吧 function check_number(){ $unique_number = time(); $exists = $this->count_rows('orders', "WHERE order_id='" . $unique_numb

我正在设计一个购物项目,并考虑使用unix时间戳作为订单ID。我知道我可以使用mySQL增量数字作为订单ID,如10001、10002等。但我不想让每个人都知道实际有多少订单

这样做安全吗?很明显,我不希望每秒超过1个订单,所以我应该是安全的,对吧

function check_number(){

$unique_number = time();
$exists = $this->count_rows('orders', "WHERE order_id='" . $unique_number . "'");

if ($exists >0){
    $results = check_number();
}
else{
    $results = $unique_number;
    return $results;
}
}

一个更健壮的解决方案是使用PHP的函数。它隐藏了系统中的订单数量,但如果两个或多个订单同时出现,它不会崩溃


至于实际问题:不,使用unix时间戳作为半随机事件的唯一ID是不安全的,比如用户下订单。不管可能性有多大,既然可以很容易避免发生碰撞,为什么还要在发生碰撞的情况下离开呢?

我不建议这样做,因为有可能在同一秒钟内发出两个订单。使用默认增量,将ID添加/减去一个固定数字,以便用户看到一个更大的数字

$ID = $_GET['ID'];
$ID -= 183727; // subtract offset
// Do mysql stuff
// Build an ID for an URL
$ID += 183727;
echo 'http://../test.php?order=' .$ID;
  • 您可以制作一个crontab,这样就可以了
    ALTER TABLE orders AUTO_INCREMENT=max_id+
    并每天或每小时随机移动(但这不是最好的做法);或者您可以在插入中随机放置id(超过当前最大id)

  • 如果要在数据库中保留整数,可以使用带salt的
    base64

  • 您可以在URL中使用uniques段塞

  • 您可以使用
    com\u create\u guid
    或类似函数,甚至可以生成随机字符串/数字,但请确保数据库中有“唯一”约束



  • “时间戳”的问题在于大量的并发操作,在特定的时间范围内,它不是唯一的;您可以使用微秒,并在末尾添加一些随机数-这会有所帮助。

    在递归调用之前放置一个
    sleep(1)
    ,以确保时间会更改。或者只使用一个循环,在循环中递增
    $unique\u number
    直到成功。没有理由将行标识符用作“订单号”,也许至少有几个理由不这么做。一般来说,用户永远不应该看到内部行标识符。@uuerdo如果用户看到数据库id,那又有什么关系呢?知道一个id不应该打开任何攻击向量,或者系统设计中存在严重缺陷。通过模糊处理实现的安全性不是您应该依赖的。RESTful API一直使用数据库ID。我不是说通过模糊性实现安全性。在代码/api级别,请确保将其作为“句柄”公开。我说的是显示在网页上或打印在发票上的数字。这个数字对用户来说意义不大,如果它需要提供(支持)的话,就很容易被不诚实的用户猜出有效的数字。此外,最终会有一种诱惑,那就是让数字变得更“用户友好”,这现在开始影响数据库设计。(突然有人想要发票号码加上字母,或者每个区域的前缀从1开始,以此类推。)